home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1996 #15 / Monster Media Number 15 (Monster Media)(July 1996).ISO / prog_bas / pbc32.zip / PBCLONE.MAN < prev    next >
Text File  |  1996-04-10  |  431KB  |  13,093 lines

  1.   PBClone 3.2  (C) Copyright 1996 Charon Software, All Rights Reserved
  2.  
  3. Name  : AddMatI              (Add Matrix Integer)
  4. Class : Array management
  5. Level : Any
  6.  
  7. This routine adds an integer to as many elements of an integer
  8. array as you like, starting at a specified place in the array.
  9. It can also be used to subtract (just specify a negative value).
  10. If there was a numeric overflow at any point in the operation,
  11. an error code will be returned.
  12.  
  13.    AddMatI DSeg%, DOfs%, Elements%, Value%, ErrCode%
  14.  
  15. DSeg%      segment of the first array element to add
  16. DOfs%      offset of the first array element to add
  17. Elements%  number of array elements to which to add
  18. Value%     value to add to each array element
  19. -------
  20. ErrCode%   error code: 0 if no error
  21.  
  22. Name  : AddMatL              (Add Matrix Long integer)
  23. Class : Array management
  24. Level : Any
  25.  
  26. This routine adds a long integer to as many elements of an long
  27. integer array as you like, starting at a specified place in the
  28. array. It can also be used to subtract (just specify a negative
  29. value). If there was a numeric overflow at any point in the
  30. operation, an error code will be returned.
  31.  
  32.    AddMatL DSeg%, DOfs%, Elements%, Value&, ErrCode%
  33.  
  34. DSeg%      segment of the first array element to add
  35. DOfs%      offset of the first array element to add
  36. Elements%  number of array elements to which to add
  37. Value&     value to add to each array element
  38. -------
  39. ErrCode%   error code: 0 if no error
  40.  
  41. Name  : AllExtMem&           (All Extended Memory)
  42. Class : Equipment
  43. Level : Clone (AT)
  44.  
  45. This routine returns the amount of extended memory installed in
  46. the system, as reported by the power-on self-test (POST) routine
  47. at boot time. This does not tell you how much extended memory is
  48. actually available, since extended memory may be carved up by
  49. users of BIOS-level extended memory or XMS memory, converted to
  50. expanded memory, etc. It only tells you the amount of physical
  51. extended memory that is installed.
  52.  
  53. Do not use this routine on PC/XT machines. It is only for
  54. AT-class computers.
  55.  
  56.    TotalKb& = AllExtMem&
  57.  
  58. -------
  59. TotalKb&      kilobytes of extended memory installed
  60.  
  61. Name  : AltKey               (Alt Key)
  62. Class : Input
  63. Level : Any
  64.  
  65. This routine works in conjunction with a key input routine, such
  66. as INKEY$ or the CheckKey and GetKey routines. Given the ASCII
  67. code and scan code of a key, AltKey returns the associated key
  68. letter, if any. For instance, it returns "A" if you pass it
  69. ASCII code 0 and scan code 30, because those codes represent
  70. Alt-A.
  71.  
  72.    AltKey ASCIICode%, ScanCode%, Ky$
  73.  
  74. ASCIICode%   ASCII code of the key
  75. ScanCode%    scan code of the key
  76. -------
  77. Ky$          associated key letter ("" if none)
  78.  
  79. Name  : AndSt                (AND String)
  80. Class : String
  81. Level : Any
  82.  
  83. This routine ANDs each byte in one string with the corresponding
  84. byte in a second string. The strings must be the same length.
  85.  
  86.    AndSt St1$, St2$
  87.  
  88. St1$      string to AND
  89. St2$      string to AND with
  90. -------
  91. St1$      result
  92.  
  93. Name  : Any2Dec              (Any to Decimal)
  94. Class : Numeric
  95. Level : Any
  96.  
  97. This routine converts a number in any base to a normal (base 10)
  98. integer. It works like the &H and &O prefixes in BASIC, but
  99. rather than working only in hexadecimal (base 16) and octal
  100. (base 8), it can be used for binary, octal, or almost anything
  101. else. The base may range from 2-35.
  102.  
  103. The input number may be in either signed or unsigned integer
  104. form, and will be converted to a signed integer. For example,
  105. the base 16 (hexadecimal) number FFFF would be converted to -1,
  106. as would the base 10 (decimal) number 65535. This may not seem
  107. to make sense if you're not familiar with the internal format
  108. for integers, but is the standard approach to converting
  109. unsigned numbers (0-65535) to signed numbers (-32768 to 32767).
  110. BASIC always uses signed integers, so the numbers will always be
  111. what you expect so long as they are kept in the range -32768 to
  112. 32767. They "wrap around" for 32768 to 65535.
  113.  
  114. The most common bases used on computers are base 2 (binary),
  115. base 8 (octal), base 10 (decimal), and base 16 (hexadecimal).
  116.  
  117.    Any2Dec Number$, NrBase%, DecNr%, ErrCode%
  118.  
  119. Number$   any-base number to convert to an integer
  120. NrBase%   number base to convert from
  121. -------
  122. DecNr%    resulting integer
  123. ErrCode%  error code: 0 if no error
  124.  
  125. Name  : AscI%                (ASC Integer)
  126. Class : String
  127. Level : Any
  128.  
  129. This is a replacement for the ASC function provided by BASIC. It
  130. is smaller than ASC, however, and also somewhat faster.
  131.  
  132. Unlike BASIC or ProBas, the PBClone AscI function returns -1 as
  133. an error condition if you try to use it on a null string. This
  134. convention owes its origin to the similar routine in Crescent's
  135. libraries.
  136.  
  137. See also AscM%, which returns the ASCII code of a character at a
  138. specific location within a string.
  139.  
  140.    Value% = AscI%(St$)
  141.  
  142. St$        string for which to return ASCII code
  143. -------
  144. Value%     code of the first string char or -1 if null string
  145.  
  146. Name  : AscM%                (ASC MID$)
  147. Class : String
  148. Level : Any
  149.  
  150. This function works like a combination of the BASIC functions
  151. ASC and MID$. It returns the ASCII code of a character at a
  152. specified position in a string. If the specified position is
  153. outside the string, -1 will be returned.
  154.  
  155. See also AscI%, which returns the ASCII code of the character at
  156. the beginning of a string.
  157.  
  158.    Value% = AscM%(St$, Posn%)
  159.  
  160. St$        string to examine
  161. Posn%      character position to examine
  162. -------
  163. Value%     code of the specified character or -1 if error
  164.  
  165. Name  : BarMenu              (Bar Menu)
  166. Class : Input
  167. Level : Clone
  168.  
  169. This is a bar menu routine. It allows the user to select one of
  170. a list of items given on a single menu row or "bar". The current
  171. item is highlighted in your choice of colors; user selection can
  172. be done either by moving this highlight and pressing return or
  173. by entering the letter associated with the desired item. Only
  174. text mode is supported.
  175.  
  176. The highlight may be moved with the left and right arrow keys,
  177. tab and backtab, or space and backspace. Selection is done with
  178. <CR>, the enter key.
  179.  
  180. The letter used to select an item is the first character of the
  181. item that is not lowercase or a space. If the item is all
  182. lowercase, the first character of the item will be used. For
  183. example, suppose you want the user to select one of "list" or
  184. "log". By passing the options to BarMenu as "List" and "lOg",
  185. you allow the user to press "L" for "List" and "O" for "lOg".
  186.  
  187. The user's choice will be returned to you as a number, with the
  188. first choice being numbered 1. If <ESC> was pressed, 0 will be
  189. returned.
  190.  
  191.    BarMenu Pick$(), Row%, LCol%, RCol%, VAttr%, HiAttr%, Prompt$
  192.  
  193. Pick$()       list of items to choose from
  194. Row%          row on which to display the bar
  195. LCol%         leftmost column of the bar
  196. RCol%         rightmost column of the bar (use -1 for autosize)
  197. VAttr%        bar color/attribute (see CalcAttr)
  198. HiAttr%       bar highlight color/attribute (see CalcAttr)
  199. Prompt$       prompt text (displayed at left side of the bar)
  200. -------
  201. Row%          # of the chosen item (1-items, or 0 if <ESC>)
  202.  
  203. Name  : BarMenuM             (Bar Menu with Mouse)
  204. Class : Input, Mouse
  205. Level : Clone
  206.  
  207. This is a bar menu routine. It functions just like BarMenu, but
  208. supports the use of a mouse as well as the keyboard. Make sure
  209. the mouse cursor is visible before calling this routine!
  210.  
  211.    BarMenuM PickList$(), Row%, LeftCol%, RightCol%, VAttr%, _
  212.       HiAttr%, Prompt$, Mouse%, ShowCursor%
  213.  
  214. PickList$()   list of items to choose from
  215. Row%          row on which to display the bar
  216. LeftCol%      leftmost column of the bar
  217. RightCol%     rightmost column of the bar (use -1 for auto-sizing)
  218. VAttr%        bar color/attribute (see CalcAttr)
  219. HiAttr%       bar highlight color/attribute (see CalcAttr)
  220. Prompt$       prompt text (displayed at the left side of the bar)
  221. Mouse%        whether a mouse is available (0 no)
  222. ShowCursor%   not used
  223. -------
  224. Row%          number of the chosen item (1-items, or 0 if <ESC>)
  225.  
  226. Name  : Bickel               (Bickel comparison)
  227. Class : String
  228. Level : Any
  229.  
  230. A string comparison routine, Bickel allows you to see how
  231. closely two strings match. The better the match, the larger the
  232. returned value will be. Since there is no constant minimum or
  233. maximum value, this routine is best used for applications
  234. involving dictionary searches. You would scan the dictionary and
  235. make a list of the best matches. This is appropriate for a
  236. spelling checker, for instance.
  237.  
  238. See also Bickel2%, the function version of this routine.
  239.  
  240.    Bickel St1$, St2$, Result%
  241.  
  242. St1$      first string to compare
  243. St2$      second string to compare
  244. -------
  245. Result%   resulting "match magnitude" value
  246.  
  247. Name  : Bickel2%             (Bickel comparison)
  248. Class : String
  249. Level : Any
  250.  
  251. A string comparison function, Bickel2% allows you to see how
  252. closely two strings match. The better the match, the larger the
  253. returned value will be. Since there is no constant minimum or
  254. maximum value, this routine is best used for applications
  255. involving dictionary searches. You would scan the dictionary and
  256. make a list of the best matches. This is appropriate for a
  257. spelling checker, for instance.
  258.  
  259. See also Bickel, the subprogram version of this routine.
  260.  
  261.    Result% = Bickel2%(St1$, St2$)
  262.  
  263. St1$      first string to compare
  264. St2$      second string to compare
  265. -------
  266. Result%   resulting "match magnitude" value
  267.  
  268. Name  : BigPrint             (Big Print)
  269. Class : Display
  270. Level : BIOS
  271.  
  272. As the name suggests, this routine displays text in large
  273. characters. How large? Eight times as high and as wide as
  274. normal! Each "big character" will be composed of many
  275. normal-sized characters. You may choose the normal character
  276. used to create the big characters (the default is a CHR$(219)
  277. solid block character, if you pass a null string here).
  278.  
  279. You should avoid using CHR$(128) to CHR$(255) when in either of
  280. the CGA graphics modes, as many CGAs are unable to display these
  281. characters when in graphics mode.
  282.  
  283.    BigPrint St$, FormCh$, Row%, Column%, VAttr%
  284.  
  285. St$       string to display in big characters
  286. FormCh$   character used to compose the big characters
  287. Row%      starting row
  288. Column%   starting column
  289. VAttr%    color/attribute of big characters (see CalcAttr)
  290.  
  291. Name  : BinSeekD             (Binary Seek Double precision)
  292. Class : Array management
  293. Level : Any
  294.  
  295. This routine uses binary search techniques to locate a specific
  296. number in a sorted double-precision array. Each number in the
  297. array must be unique (no duplicates) for this to work. This is a
  298. very, very fast routine and is especially handy for look-up
  299. tables.
  300.  
  301. The array is expected to begin at element 1. You may specify the
  302. maximum element to search, allowing use of only part of an
  303. array.
  304.  
  305. A single number is returned in Posn%. If Posn% is greater than
  306. zero, the target number was found and Posn% is the position in
  307. the array where it was found. If Posn% is negative, the target
  308. number was not found, but it could be inserted into the array at
  309. the -Posn% element. If the number is zero, the target number was
  310. not found and there is no room in the array to add any more
  311. values.
  312.  
  313.    BinSeekD Array#(), Elements%, Target#, Posn%
  314.  
  315. Array#()    array of sorted, unique values to search
  316. Elements%   maximum array element to search
  317. Target#     value to look for
  318. -------
  319. Posn%       whether and where the target was found (see above)
  320.  
  321. Name  : BinSeekI             (Binary Seek Integer)
  322. Class : Array management
  323. Level : Any
  324.  
  325. This routine uses binary search techniques to locate a specific
  326. number in a sorted integer array. Each number in the array must
  327. be unique (no duplicates) for this to work. This is a very, very
  328. fast routine and is especially handy for look-up tables.
  329.  
  330. The array is expected to begin at element 1. You may specify the
  331. maximum element to search, allowing use of only part of an
  332. array.
  333.  
  334. A single number is returned in Posn%. If Posn% is greater than
  335. zero, the target number was found and Posn% is the position in
  336. the array where it was found. If Posn% is negative, the target
  337. number was not found, but it could be inserted into the array at
  338. the -Posn% element. If the number is zero, the target number was
  339. not found and there is no room in the array to add any more
  340. values.
  341.  
  342.    BinSeekI Array%(), Elements%, Target%, Posn%
  343.  
  344. Array%()    array of sorted, unique values to search
  345. Elements%   maximum array element to search
  346. Target%     value to look for
  347. -------
  348. Posn%       whether and where the target was found (see above)
  349.  
  350. Name  : BinSeekL             (Binary Seek Long integer)
  351. Class : Array management
  352. Level : Any
  353.  
  354. This routine uses binary search techniques to locate a specific
  355. number in a sorted long integer array. Each number in the array
  356. must be unique (no duplicates) for this to work. This is a very,
  357. very fast routine and is especially handy for look-up tables.
  358.  
  359. The array is expected to begin at element 1. You may specify the
  360. maximum element to search, allowing use of only part of an
  361. array.
  362.  
  363. A single number is returned in Posn%. If Posn% is greater than
  364. zero, the target number was found and Posn% is the position in
  365. the array where it was found. If Posn% is negative, the target
  366. number was not found, but it could be inserted into the array at
  367. the -Posn% element. If the number is zero, the target number was
  368. not found and there is no room in the array to add any more
  369. values.
  370.  
  371.    BinSeekL Array&(), Elements%, Target&, Posn%
  372.  
  373. Array&()    array of sorted, unique values to search
  374. Elements%   maximum array element to search
  375. Target&     value to look for
  376. -------
  377. Posn%       whether and where the target was found (see above)
  378.  
  379. Name  : BinSeekS             (Binary Seek Single precision)
  380. Class : Array management
  381. Level : Any
  382.  
  383. This routine uses binary search techniques to locate a specific
  384. number in a sorted single-precision array. Each number in the
  385. array must be unique (no duplicates) for this to work. This is a
  386. very, very fast routine and is especially handy for look-up
  387. tables.
  388.  
  389. The array is expected to begin at element 1. You may specify the
  390. maximum element to search, allowing use of only part of an
  391. array.
  392.  
  393. A single number is returned in Posn%. If Posn% is greater than
  394. zero, the target number was found and Posn% is the position in
  395. the array where it was found. If Posn% is negative, the target
  396. number was not found, but it could be inserted into the array at
  397. the -Posn% element. If the number is zero, the target number was
  398. not found and there is no room in the array to add any more
  399. values.
  400.  
  401.    BinSeekS Array!(), Elements%, Target!, Posn%
  402.  
  403. Array!()    array of sorted, unique values to search
  404. Elements%   maximum array element to search
  405. Target!     value to look for
  406. -------
  407. Posn%       whether and where the target was found (see above)
  408.  
  409. Name  : BinSeekSt            (Binary Seek String)
  410. Class : Array management
  411. Level : Any
  412.  
  413. This routine uses binary search techniques to locate a specific
  414. string in a sorted string array. Each string in the array must
  415. be unique (no duplicates) for this to work. This is a very, very
  416. fast routine and is especially handy for look-up tables.
  417.  
  418. The string array is expected to begin at element 1. You may
  419. specify the maximum element to search, allowing use of only part
  420. of an array. You must specify whether capitalization matters--
  421. set CapsCount% to 0 if it doesn't.
  422.  
  423. A single number is returned in Posn%. If the number is greater
  424. than zero, the target string was found, and the number is the
  425. position in the array where it was found. If the number is
  426. negative, the target string was not found, but it could be
  427. inserted into the array at the -Posn% element. If the number is
  428. zero, the target string was not found and there is no room in
  429. the array to add any more values.
  430.  
  431.    BinSeekSt Array$(), Elements%, Target$, CapsCount%, Posn%
  432.  
  433. Array$()    array of sorted, unique values to search
  434. Elements%   maximum array element to search
  435. Target$     string to look for
  436. CapsCount%  0 if capitalization doesn't matter
  437. -------
  438. Posn%       whether and where the target was found (see above)
  439.  
  440. Name  : BIOSInkey            (BIOS INKEY$)
  441. Class : Input
  442. Level : BIOS
  443.  
  444. BIOSInkey works like INKEY$, but it gets its key directly by
  445. asking the BIOS. The primary advantage of this is that you get
  446. the "scan" code as well as the ASCII code of the key. The scan
  447. code is independent of the shift status-- for instance, the scan
  448. code for "A" is the same as the scan code for "a" or Control-A
  449. or Alt-A. This can be very handy.
  450.  
  451. If there is no key available, both the scan code and ASCII code
  452. will be zero.
  453.  
  454.    BIOSInkey AscCode%, ScanCode%
  455.  
  456. -------
  457. AscCode%    ASCII code of the key, if any
  458. ScanCode%   scan code of the key, if any
  459.  
  460. Name  : BkScroll             (Backward Scroll)
  461. Class : Display
  462. Level : BIOS
  463.  
  464. This routine scrolls any selected part of the display down-- it
  465. does a backwards scroll. You may scroll as many times as you
  466. like, or scroll "zero" times to totally clear the selected part
  467. of the display.
  468.  
  469. Note that BIOS-level scrolling can cause the screen to flicker
  470. on some CGAs due to a combination of unfortunate design factors.
  471.  
  472.    BkScroll TopRow%, LeftCol%, BottomRow%, RightCol%, Times%
  473.  
  474. TopRow%      top row of the area to scroll
  475. LeftCol%     left column of the area to scroll
  476. BottomRow%   top row of the area to scroll
  477. RightCol%    left column of the area to scroll
  478. Times%       number of times (or rows) to scroll
  479.  
  480. Name  : BkSpace              (Backspace)
  481. Class : Display
  482. Level : BIOS
  483.  
  484. Although CHR$(8) is supposed to mean "backspace", it shows up as
  485. a graphics character when BASIC prints it. This routine does an
  486. actual backspace with full wrap-- if it's at the beginning of
  487. the line, it will move back to the previous line (if there is
  488. one). It backspaces destructively (erasing the previous
  489. character) from the current cursor position. The new cursor is
  490. returned to you, since QuickBASIC may ignore the new status.
  491.  
  492.    BkSpace Row%, Column%       ' do the backspace
  493.    LOCATE Row%, Column%        ' inform QuickBASIC
  494.  
  495. -------
  496. Row%      new row
  497. Column%   new column
  498.  
  499. Name  : Blink                (Blink toggle)
  500. Class : Display
  501. Level : BIOS / Clone (see text)
  502.  
  503. It is possible to make characters in text mode blink by giving
  504. them an appropriate "color". I wouldn't mention something so
  505. obvious but for another possibility which is less widely known:
  506. blinking can be turned off, in which case the characters that
  507. would have otherwise blinked will instead have a bright
  508. background. In other words, turn off blinking, and you double
  509. the possible number of background colors.
  510.  
  511. This technique will always work with EGA and VGA displays. It
  512. can also be used with MDA/Hercules and CGA displays, on which it
  513. will almost always work... unfortunately, on some
  514. less-than-perfect PC clones, it will cause the computer to lock
  515. up instead. So, be careful with this one!
  516.  
  517.    Blink SetBlink%
  518.  
  519. SetBlink%    use blink (-1) or intense backgrounds (0)
  520.  
  521. Name  : BlockMove            (Block memory Move)
  522. Class : Memory
  523. Level : Clone
  524.  
  525. This routine allows you to copy or "move" a block of data from
  526. one memory location to another. It isn't very bright, so if the
  527. memory areas overlap, you will have to tell the routine to "move
  528. backwards" instead of forwards. In that case, you will also have
  529. to change the offsets to point to the ends of the memory areas
  530. instead of the beginnings.
  531.  
  532. Normally, you can use forward moves. In that case, the offsets
  533. you specify are those of the beginning of the memory areas. If
  534. backward moves are required, the offsets specified are those of
  535. the end of the memory areas.
  536.  
  537. If you are familiar with assembly language, you may recognize
  538. this as a straightforward implementation of the "REP MOVSB"
  539. instruction.
  540.  
  541. You may move up to 65,520 bytes at a time, provided that the
  542. addresses are in normalized form (if you don't know what this
  543. means, you probably don't need to worry about it).
  544.  
  545. This routine can be used to copy information to an array from
  546. any area of memory (the BIOS data area, the screen, another
  547. array, etc), or vice versa. It can also be used to do things
  548. like insert/delete elements from an array, scroll the screen,
  549. fill the screen with a specified character, and so on.
  550.  
  551.    BlockMove FromSeg%, FromOfs%, ToSeg%, ToOfs%, Bytes&, Dirn%
  552.  
  553. FromSeg%    segment of the area from which to copy
  554. FromOfs%    offset of the area from which to copy
  555. ToSeg%      segment of the area to which to copy
  556. ToOfs%      offset of the area to which to copy
  557. Bytes&      number of bytes to copy (0-65,520)
  558. Dirn%       direction to copy (0 if forward, else backward)
  559.  
  560. Name  : BootDrive            (get Boot Drive)
  561. Class : Disk
  562. Level : DOS
  563.  
  564. This routine tells you which drive was used to boot the system.
  565. See also BootDrive2, a function version of this routine.
  566.  
  567. One use for BootDrive would be in installation programs, to
  568. determine the most likely destination drive for your software.
  569.  
  570.    Drive$ = "x"
  571.    BootDrive Drive$
  572.  
  573. -------
  574. Drive$   boot drive-- set it to at least one char beforehand!
  575.  
  576. Name  : BootDrive2$          (get Boot Drive)
  577. Class : Disk
  578. Level : DOS
  579.  
  580. This routine tells you which drive was used to boot the system.
  581.  
  582. One use for BootDrive2 would be in installation programs, to
  583. determine the most likely destination drive for your software.
  584.  
  585.    Drive$ = BootDrive2$
  586.  
  587. -------
  588. Drive$   boot drive (null if wrong DOS version)
  589.  
  590. Name  : BoxMenu              (Box Menu)
  591. Class : Input
  592. Level : Clone
  593.  
  594. This routine displays a list of items you pass it as a string
  595. array. The list is displayed in a window in a single column. If
  596. there are more items than will fit in the window, the items may
  597. be scrolled as necessary. The user may pick a single item from
  598. the list.
  599.  
  600. Many of the usual WindowManager parameters are used here-- top
  601. row, left column, and bottom row (right column is calculated for
  602. you), window frame color and frame type, growth, shadow, title
  603. string and title color-- see the WindowManager routine for
  604. details.
  605.  
  606. If you allow using the mouse, be sure the mouse is initialized
  607. (MMCheck or MMCheck2%) and the mouse cursor is visible
  608. (MMCursorOn) before calling this routine.
  609.  
  610. This routine automatically saves and restores the underlying
  611. screen.
  612.  
  613. See CalcAttr if you're not familiar with color/attributes. See
  614. also BoxMenu1 if you need to allow multiple selections.
  615.  
  616.    BoxMenu Mouse%, PickList$(), TopRow%, LeftCol%, _
  617.       BottomRow%, Frame%, FrameAttr%, ItemListAttr%, _
  618.       HiliteAttr%, TitleFore%, Title$, Grow%, Shade%, Result%
  619.  
  620. Mouse%          whether to support the mouse (0 no, -1 yes)
  621. PickList$()     items to pick from (starting at PickList$(1))
  622. TopRow%         top row of pick window
  623. LeftCol%        left column of pick window
  624. BottomRow%      bottom row of pick window
  625. Frame%          frame type
  626. FrameAttr%      frame color/attribute
  627. ItemListAttr%   item list color/attribute
  628. HiliteAttr%     highlight bar color/attribute
  629. TitleFore%      title foreground color (backgnd is frame color)
  630. Title$          title (use "" for no title)
  631. Grow%           window growth
  632. Shade%          window shadow
  633. -------
  634. Result%         number of item picked (0 if none)
  635.  
  636. Name  : BoxMenu1             (Box Menu variant 1)
  637. Class : Input
  638. Level : Clone
  639.  
  640. This routine displays a list of items you pass it as a string
  641. array. The list is displayed in a window in a single column. If
  642. there are more items than will fit in the window, the items may
  643. be scrolled as necessary. The user may pick multiple items from
  644. the list, using the space bar to toggle selection. All items may
  645. be selected with Ctrl-Enter, or deselected with Ctrl-Backspace.
  646.  
  647. Many of the usual WindowManager parameters are used here-- top
  648. row, left column, and bottom row (right column is calculated for
  649. you), window frame color and frame type, growth, shadow, title
  650. string and title color-- see the WindowManager routine for
  651. details.
  652.  
  653. If you allow using the mouse, be sure the mouse is initialized
  654. (MMCheck or MMCheck2%) and the mouse cursor is visible
  655. (MMCursorOn) before calling this routine.
  656.  
  657. BoxMenu1 automatically saves and restores the underlying screen.
  658.  
  659. See CalcAttr if you're not familiar with color/attributes. See
  660. also BoxMenu if you only need single-item selection.
  661.  
  662. You must pass an integer array corresponding to the pick list
  663. array. Each of the integers flags whether the corresponding item
  664. is picked-- 0 if no, -1 if yes. You may initialize this array
  665. according to the selection defaults you prefer.
  666.  
  667. The Marker$ value is two characters which specify the left and
  668. right characters to use to mark an item as selected. If you
  669. leave Marker$ = "", the default will be "<>".
  670.  
  671.    BoxMenu1 Mouse%, PickList$(), Picked%(), Marker$, TopRow%, _
  672.       LeftCol%, BottomRow%, Frame%, FrameAttr%, _
  673.       ItemListAttr%, HiliteAttr%, TitleFore%, Title$, Grow%, _
  674.       Shade%, Picks%
  675.  
  676. Mouse%          whether to support the mouse (0 no, -1 yes)
  677. PickList$()     items to pick from (starting at PickList$(1))
  678. Picked%()       if corresponding PickList$() item is picked
  679. Marker$         left and right pick markers ("" for default)
  680. TopRow%         top row of pick window
  681. LeftCol%        left column of pick window
  682. BottomRow%      bottom row of pick window
  683. Frame%          frame type
  684. FrameAttr%      frame color/attribute
  685. ItemListAttr%   item list color/attribute
  686. HiliteAttr%     highlight bar color/attribute
  687. TitleFore%      title foreground color (backgnd is frame color)
  688. Title$          title (use "" for no title)
  689. Grow%           window growth
  690. Shade%          window shadow
  691. -------
  692. Picked%()       if corresponding PickList$() item is picked
  693. Picks%          number of items picked (0 if none)
  694.  
  695. Name  : BRead                (Byte Read)
  696. Class : Disk
  697. Level : DOS
  698.  
  699. This routine reads a byte from a file into an integer. The byte
  700. is zero-extended into the integer, providing a value that may
  701. range from 0-255.
  702.  
  703. The file must have been opened using FCreate or FOpen1.
  704.  
  705.    BRead Handle%, Value%, ErrCode%
  706.  
  707. Handle%    file handle
  708. -------
  709. Value%     byte read from file
  710. ErrCode%   DOS error code (0 if no error)
  711.  
  712. Name  : BreakCheck%          (Break key Check)
  713. Class : Input
  714. Level : BIOS
  715.  
  716. This routine is for use after BreakOff. It allows you to see
  717. whether the Break key has been pressed since you last checked.
  718. The Break status is cleared after the value is returned.
  719.  
  720.    Brk% = BreakCheck%
  721.    IF Brk% THEN
  722.       PRINT "** Break key pressed **"
  723.       GOTO EndProgram
  724.    END IF
  725.  
  726. -------
  727. Brk%    whether Break was pressed (0 no, -1 yes)
  728.  
  729. Name  : BreakOff             (Break key Off)
  730. Class : Input
  731. Level : BIOS
  732.  
  733. This routine disables the Break key. It is not effective in the
  734. QB or QBX environments, as these use their own keyboard handler.
  735. It is also not effective if your program was compiled with
  736. Debugging on (/D switch).
  737.  
  738. Note that BreakOff installs a routine to intercept some
  739. interrupt vectors. You MUST use the BreakOffDone routine to
  740. reverse this process before your program ends, or the computer
  741. will be left in an indeterminate state and will probably crash
  742. the next time Break is pressed!
  743.  
  744.    BreakOff
  745.  
  746. Name  : BreakOffDone         (Break key Off routine Done)
  747. Class : Input
  748. Level : BIOS
  749.  
  750. This routine is used after BreakOff to restore the original
  751. interrupt vectors. If you use BreakOff, you MUST call
  752. BreakOffDone before your program ends! Otherwise, the computer
  753. will probably crash the next time someone presses Break.
  754.  
  755.    BreakOffDone
  756.  
  757. Name  : BSq                  (Blank Squeeze)
  758. Class : String
  759. Level : Any
  760.  
  761. A simple compression routine, BSq "squeezes" the blank spaces in
  762. a string. It is designed expressly for use with text data. The
  763. text may not contain more than 131 spaces in a row, or CHR$(128)
  764. through CHR$(255), which are used in the compression.
  765.  
  766. Average text files are liable to be compressed by around 16%.
  767. Files that contain more spaces, such as structured programs,
  768. will benefit more. The compression algorithm is simple but
  769. extremely fast, adding no noticeable overhead to string
  770. processing.
  771.  
  772. See also BUsq, BUsqLen.
  773.  
  774.    BSq St$, StLen%
  775.    St$ = LEFT$(St$, StLen%)
  776.  
  777. St$     string to compress
  778. -------
  779. St$     compressed string
  780. StLen%  length of the compressed string
  781.  
  782. Name  : BUsq                 (Blank Unsqueeze)
  783. Class : String
  784. Level : Any
  785.  
  786. This routine is used to uncompress strings that were processed
  787. by BSq. Before uncompression, the BUsqLen routine must be used
  788. to find out how long the resulting string will be.
  789.  
  790. See also BSq, BUsqLen.
  791.  
  792.    BUsqLen St$, StLen%
  793.    IF StLen% < 0 THEN
  794.       PRINT "Error in compressed string"
  795.    ELSE
  796.       Result$ = SPACE$(StLen%)
  797.       BUsq St$, Result$
  798.    END IF
  799.  
  800. St$      string to uncompress
  801. -------
  802. Result$  uncompressed string
  803.  
  804. Name  : BUsqLen              (Blank Unsqueeze Length)
  805. Class : String
  806. Level : Any
  807.  
  808. This routine is used in coordination with BUsq to uncompress
  809. strings that were processed by BSq. It determines what the
  810. length of the uncompressed string will be, which is necessary to
  811. initialize the string for BUsq.
  812.  
  813. See also BSq, BUsq.
  814.  
  815.    BUsqLen St$, StLen%
  816.    IF StLen% < 0 THEN
  817.       PRINT "Error in compressed string"
  818.    ELSE
  819.       Result$ = SPACE$(StLen%)
  820.       BUsq St$, Result$
  821.    END IF
  822.  
  823. St$      string to uncompress
  824. -------
  825. StLen%   length of the uncompressed string
  826.  
  827. Name  : BWrite               (Byte Write)
  828. Class : Disk
  829. Level : DOS
  830.  
  831. This routine writes a byte to a file from an integer. The least
  832. significant byte of the integer is written.
  833.  
  834. The file must have been opened using FCreate or FOpen1.
  835.  
  836.    BWrite Handle%, Value%, ErrCode%
  837.  
  838. Handle%    file handle
  839. Value%     byte to write to file
  840. -------
  841. ErrCode%   DOS error code (0 if no error)
  842.  
  843. Name  : CalcAttr             (Calculate Attribute)
  844. Class : Display
  845. Level : Any
  846.  
  847. Many of the display routines in this library require an
  848. "attribute" rather than foreground and background colors. An
  849. attribute is a combination of the foreground and background
  850. colors in a format which is used by all types of displays when
  851. in text mode.
  852.  
  853. Foreground colors are usually specified as 0-31, with
  854. backgrounds as 0-7. If you turn blinking off (see Blink), it may
  855. be more convenient to express the same thing as foreground 0-15,
  856. background 0-15. The CalcAttr routine will accept either way of
  857. expressing it.
  858.  
  859. Note, however, that UnCalcAttr will always return the former
  860. pair of results, since it has no way of knowing whether Blink
  861. has been used (foreground 0-31, background 0-15). See UnCalcAttr
  862. for more details and a solution.
  863.  
  864. See also CalcAttr2, the FUNCTION version of this routine.
  865.  
  866.    CalcAttr Foreground%, Background%, VAttr%
  867.  
  868. Foreground%  foreground color
  869. Background%  background color
  870. -------
  871. VAttr%       color "attribute"
  872.  
  873. Name  : CalcAttr2%           (Calculate Attribute)
  874. Class : Display
  875. Level : Any
  876.  
  877. Many of the display routines in this library require an
  878. "attribute" rather than foreground and background colors. An
  879. attribute is a combination of the foreground and background
  880. colors in a format which is used by all types of displays when
  881. in text mode.
  882.  
  883. Foreground colors are usually specified as 0-31, with
  884. backgrounds as 0-7. If you turn blinking off (see Blink), it may
  885. be more convenient to express the same thing as foreground 0-15,
  886. background 0-15. The CalcAttr2 routine will accept either way of
  887. expressing it.
  888.  
  889. Note, however, that UnCalcAttr will always return the former
  890. pair of results, since it has no way of knowing whether Blink
  891. has been used (foreground 0-31, background 0-15). See UnCalcAttr
  892. for more details and a solution.
  893.  
  894. See also CalcAttr, the SUB version of this routine.
  895.  
  896.    VAttr% = CalcAttr2%(Foreground%, Background%)
  897.  
  898. Foreground%  foreground color
  899. Background%  background color
  900. -------
  901. VAttr%       color "attribute"
  902.  
  903. Name  : CalcDate             (Calculate Date)
  904. Class : Time
  905. Level : Any
  906.  
  907. This routine calculates what the date will be a given number of
  908. days from now, either in the past or the future. Actually, you
  909. may use any starting date, not just the current date. An error
  910. code is returned if the starting date or resulting date are not
  911. valid. Dates may not preceed January 1, 1900.
  912.  
  913. CalcDate accepts the date in any standard form ("01/30/91" or
  914. "01-30-1991", for example) and returns its results in the same
  915. format.
  916.  
  917.    CalcDate StartDate$, Days&, Direction%, NewDate$, ErrCode%
  918.  
  919. StartDate$   starting date
  920. Days&        number of days from the current date (0 or more)
  921. Direction%   return future result (0) or past (nonzero)
  922. -------
  923. NewDate$     resulting date
  924. ErrCode%     whether the dates are valid (0 yes)
  925.  
  926. Name  : CalcSize             (Calculate array Size)
  927. Class : Display
  928. Level : Any
  929.  
  930. This routine calculates the necessary DIM size for an integer
  931. array, assuming that you intend to store display data in the
  932. array. This is most useful in conjunction with DGetScreen and
  933. GetScreen.
  934.  
  935.    CalcSize TopRow%, LeftCol%, BottomRow%, RightCol%, Elements%
  936.    DIM Array%(1 TO Elements%)
  937.  
  938. TopRow%      top row of the display area
  939. LeftCol%     left column of the display area
  940. BottomRow%   top row of the display area
  941. RightCol%    left column of the display area
  942. -------
  943. Elements%    required size of the integer array
  944.  
  945. Name  : CalcVGAColor         (Calculate VGA palette Color)
  946. Class : Display
  947. Level : Any
  948.  
  949. The QuickBASIC manual gives a cumbersome formula for calculating
  950. VGA palette colors. This routine does it faster and with less
  951. fuss. All you need to do is pass it the appropriate intensity
  952. values (0-63) and you get back a long integer, just the way
  953. BASIC wants it.
  954.  
  955.    CalcVGAColor Red%, Green%, Blue%, Colour&
  956.  
  957. Red%      red   intensity
  958. Green%    green intensity
  959. Blue%     blue  intensity
  960. -------
  961. Colour&   color value for use in the PALETTE statement
  962.  
  963. Name  : Carrier              (detect Carrier)
  964. Class : Serial
  965. Level : Clone
  966.  
  967. If you write communications programs, particularly things like
  968. doors and BBSes, you probably want to keep an eye on the
  969. carrier. BASIC won't do it, but we will!
  970.  
  971.    Carrier CommPort%, CarrierHigh%
  972.  
  973. CommPort%     serial port (1-4, though BASIC only handles 1-2)
  974. -------
  975. CarrierHigh%  zero if no carrier
  976.  
  977. Name  : CatchError           (Catch Error from SHELL)
  978. Class : Miscellaneous
  979. Level : Clone
  980.  
  981. NOTE: You should use the GetError2% function in preference to
  982. this set of routines.
  983.  
  984. The CatchError routine is used in conjunction with GetError. It
  985. lets you get the exit code (error level) returned by a program
  986. to which you have SHELLed. Since CatchError hooks an interrupt
  987. to do its work, you must always make sure to use GetError
  988. afterwards to "clean up". See also GetError.
  989.  
  990. Note that differences in DOS mean that this routine will not
  991. always work. In some versions of DOS, you can only get the error
  992. level if a batch file was executed; in others, you can't get the
  993. error level from a batch file at all. Sorry about that. I don't
  994. know of any way to work around it.
  995.  
  996.    CatchError
  997.    SHELL ProgramName$
  998.    GetError ExitCode%
  999.  
  1000. Name  : CDROM                (check for CD-ROM)
  1001. Class : Disk / Equipment
  1002. Level : DOS
  1003.  
  1004. This routine tells you whether the Microsoft CD-ROM Extensions
  1005. are installed. If so, it tells you what the letter of the first
  1006. CD-ROM logical drive is and how many logical drives exist.
  1007.  
  1008. Note: The CD-ROM installation check conflicts with the
  1009. GRAPHICS.COM installation check for DOS 4.0, due to some
  1010. screw-up at IBM or Microsoft. This may cause unexpected results.
  1011.  
  1012.    FirstDrive$ = "x"
  1013.    CDROM FirstDrive$, Drives%
  1014.  
  1015. -------
  1016. FirstDrive$   letter of first logical drive (init to >= 1 char)
  1017. Drives%       number of logical drives (0 if no CD-ROM)
  1018.  
  1019. Name  : CDROM2%              (check for CD-ROM)
  1020. Class : Disk / Equipment
  1021. Level : DOS
  1022.  
  1023. This routine tells you whether the Microsoft CD-ROM Extensions
  1024. are installed. If so, it tells you how many logical drives
  1025. exist.
  1026.  
  1027. Note: The CD-ROM installation check conflicts with the
  1028. GRAPHICS.COM installation check for DOS 4.0, due to some
  1029. screw-up at IBM or Microsoft. This may cause unexpected results.
  1030.  
  1031.    Drives% = CDROM2%
  1032.  
  1033. -------
  1034. Drives%       number of logical drives (0 if no CD-ROM)
  1035.  
  1036. Name  : CeilD#               (Ceiling, Double-precision)
  1037. Class : String
  1038. Level : Any
  1039.  
  1040. This function returns the smallest integer greater than or equal
  1041. to the number you give it. This is most often used for rounding.
  1042.  
  1043.    Result# = CeilD#(Nr#)
  1044.  
  1045. Nr#          number to process
  1046. -------
  1047. Result#      result
  1048.  
  1049. Name  : CeilS!               (Ceiling, Single-precision)
  1050. Class : String
  1051. Level : Any
  1052.  
  1053. This function returns the smallest integer greater than or equal
  1054. to the number you give it. This is most often used for rounding.
  1055.  
  1056.    Result! = CeilS!(Nr!)
  1057.  
  1058. Nr!          number to process
  1059. -------
  1060. Result!      result
  1061.  
  1062. Name  : CenterSt$            (Center String)
  1063. Class : String
  1064. Level : Any
  1065.  
  1066. This function returns a string centered in a field of spaces.
  1067.  
  1068.    Result$ = CenterSt$(StToCenter$, Columns%)
  1069.  
  1070. StToCenter$   string to center
  1071. Columns%      width of field in which to center string
  1072. -------
  1073. Result$       field of spaces with string centered in it
  1074.  
  1075. Name  : CheckCAS%            (Check CAS driver)
  1076. Class : Serial
  1077. Level : BIOS
  1078.  
  1079. This function tells you whether a CAS driver is installed. CAS
  1080. is the DCA/Intel "Communicating Applications Specification"
  1081. (apparently named by someone whose prolonged wearing of ties cut
  1082. off the flow of blood to his brain) used by a number of
  1083. faxmodems. CheckCAS% returns -1 if CAS is available, 0 if not.
  1084.  
  1085.    CAS% = CheckCAS%
  1086.  
  1087. -------
  1088. CAS%        whether a CAS driver is installed (0 no, -1 yes)
  1089.  
  1090. Name  : CheckDate            (Check Date validity)
  1091. Class : Time
  1092. Level : Any
  1093.  
  1094. This routine checks a date to see if it is valid.
  1095.  
  1096.    CheckDate MonthNr%, DayNr%, YearNr%, ErrCode%
  1097.  
  1098. MonthNr%     month number (1-12)
  1099. DayNr%       day number (1-31)
  1100. YearNr%      year number (1900 on; years <100 assumed 1900s)
  1101. -------
  1102. ErrCode%     whether the date is valid (0 yes)
  1103.  
  1104. Name  : CheckDisk            (Check Disk readiness)
  1105. Class : Disk
  1106. Level : DOS
  1107.  
  1108. The CheckDisk routine determines whether a disk is ready. About
  1109. the only thing it won't tell you is if a disk is write-protected
  1110. or out of space. Since the PBClone disk routines all contain
  1111. critical error handling, which reports back an appropriate error
  1112. code for all such problems, this routine isn't really needed any
  1113. more. It's included for compatibility with old ProBas programs.
  1114.  
  1115. Results will normally be returned as one of the following,
  1116. although not all DOS versions report the exact cause of the
  1117. error, in which case the error number may not mean what you
  1118. expect.
  1119.  
  1120.    0   no error
  1121.    1   unformatted disk
  1122.    2   open drive door
  1123.    3   bad drive spec
  1124.  
  1125.    CheckDisk Drive$, ErrCode%
  1126.  
  1127. Drive$    letter of the drive to check
  1128. -------
  1129. ErrCode%  0 if no error, nonzero for error (see above)
  1130.  
  1131. Name  : CheckDsk%            (Check Disk readiness)
  1132. Class : Disk
  1133. Level : DOS
  1134.  
  1135. The CheckDsk% function determines whether a disk is ready. About
  1136. the only thing it won't tell you is if a disk is write-protected
  1137. or out of space. Since the PBClone disk routines all contain
  1138. critical error handling, which reports back an appropriate error
  1139. code for all such problems, this routine isn't really needed any
  1140. more. It's included for compatibility with old ProBas programs.
  1141.  
  1142. Note that DOS versions before 3.0 do not return as useful error
  1143. codes as later versions. Under such circumstances, both
  1144. "unformatted disk" and "open drive door" will be returned as
  1145. "open drive door".
  1146.  
  1147.    ErrCode% = CheckDsk%(Drive$)
  1148.  
  1149. Drive$    letter of the drive to check
  1150.  
  1151. Name  : CheckKey             (Check for Key or mouse)
  1152. Class : Input, Mouse
  1153. Level : BIOS
  1154.  
  1155. This routine is kind of an extended version of INKEY$. It checks
  1156. the keyboard to see if any key is available and gets the key if
  1157. it is. At your option, it can also check the mouse to see if a
  1158. button has been pressed.
  1159.  
  1160.    CheckKey Mouse%, ASCIIcode%, ScanCode%, LButton%, RButton%
  1161.  
  1162. Mouse%        whether to check the mouse (0: no)
  1163. -------
  1164. ASCIIcode%    ASCII code of the key pressed
  1165. ScanCode%     scan code of the key pressed (0 if none)
  1166. LButton%      whether the left  mouse button was pressed
  1167. RButton%      whether the right mouse button was pressed
  1168.  
  1169. Name  : CheckKey3            (Check for Key or 3-button mouse)
  1170. Class : Input, Mouse
  1171. Level : BIOS
  1172.  
  1173. This routine is kind of an extended version of INKEY$. It checks
  1174. the keyboard to see if any key is available and gets the key if
  1175. it is. At your option, it can also check the mouse to see if a
  1176. button has been pressed.
  1177.  
  1178.    CheckKey3 Mouse%, ASCIIcode%, ScanCode%, LButton%,
  1179.       MButton%, RButton%
  1180.  
  1181. Mouse%        whether to check the mouse (0: no)
  1182. -------
  1183. ASCIIcode%    ASCII code of the key pressed
  1184. ScanCode%     scan code of the key pressed (0 if none)
  1185. LButton%      whether the left   mouse button was pressed
  1186. MButton%      whether the middle mouse button was pressed
  1187. RButton%      whether the right  mouse button was pressed
  1188.  
  1189. Name  : CheckShare           (Check for SHARE)
  1190. Class : Disk
  1191. Level : DOS
  1192.  
  1193. The CheckShare routine determines whether SHARE.EXE is active.
  1194. This is particularly helpful before using the BASIC OPEN
  1195. statement, which will fail if you request file sharing when it's
  1196. not available. The PBClone file routines handle such situations
  1197. automatically, so CheckShare is not needed for them.
  1198.  
  1199.    CheckShare ShareActive%
  1200.  
  1201. -------
  1202. ShareActive%   whether SHARE is active (0 if no)
  1203.  
  1204. Name  : CheckShare2%         (Check for SHARE)
  1205. Class : Disk
  1206. Level : DOS
  1207.  
  1208. The CheckShare2% function determines whether SHARE.EXE is
  1209. active. This is particularly helpful before using the BASIC OPEN
  1210. statement, which will fail if you request file sharing when it's
  1211. not available. The PBClone file routines handle such situations
  1212. automatically, so CheckShare2% is not needed for them.
  1213.  
  1214.    ShareActive% = CheckShare2%
  1215.  
  1216. -------
  1217. ShareActive%   whether SHARE is active (0 if no)
  1218.  
  1219. Name  : Checksum             (calculate Checksum)
  1220. Class : Serial
  1221. Level : Any
  1222.  
  1223. The Checksum routine calculates a checksum on a string. The
  1224. resulting number is compatible with Xmodem and Ymodem checksum
  1225. routines and will vary from 0-255. This checksum provides a
  1226. minimal, but fast, check of what characters are contained in the
  1227. string. See also Checksum2%, the function version of this
  1228. routine, and CRC1.
  1229.  
  1230.    Checksum St$, ChkSum%
  1231.  
  1232. St$       string to process
  1233. -------
  1234. ChkSum%   checksum of the characters in the string
  1235.  
  1236. Name  : Checksum2%           (calculate Checksum)
  1237. Class : Serial
  1238. Level : Any
  1239.  
  1240. The Checksum2% function calculates a checksum on a string. The
  1241. resulting number is compatible with Xmodem and Ymodem checksum
  1242. routines and will vary from 0-255. This checksum provides a
  1243. minimal, but fast, check of what characters are contained in the
  1244. string. See also Checksum, the sub version of this function, and
  1245. CRC1.
  1246.  
  1247.    ChkSum% = Checksum2% (St$)
  1248.  
  1249. St$       string to process
  1250. -------
  1251. ChkSum%   checksum of the characters in the string
  1252.  
  1253. Name  : Cipher               (Cipher)
  1254. Class : String
  1255. Level : Any
  1256.  
  1257. This is a very simple text encryption routine. It isn't
  1258. particularly hard to crack, but will provide a basic level of
  1259. security for undemanding applications. The same routine can be
  1260. used either to encrypt or decrypt text. The original text may
  1261. contain any character; likewise, the resulting text. This is not
  1262. well suited for use with sequential files-- if such is required,
  1263. see CipherP.
  1264.  
  1265. I'd suggest using a long password composed of an unlikely string
  1266. of characters, e.g. "#*@@!A^%x{.'".
  1267.  
  1268.    Cipher St$, Password$
  1269.  
  1270. St$        string to encrypt or decrypt
  1271. Password$  password
  1272. -------
  1273. St$        encrypted or decrypted string
  1274.  
  1275. Name  : CipherP              (Cipher Printable)
  1276. Class : String
  1277. Level : Any
  1278.  
  1279. This is a very simple text encryption routine. It isn't
  1280. particularly hard to crack, but will provide a basic level of
  1281. security for undemanding applications. The same routine can be
  1282. used either to encrypt or decrypt text. The original text may
  1283. contain any character below CHR$(128), as may the password. The
  1284. resulting text will be printable, if bizarre (all characters
  1285. will be above CHR$(127)), and may be used with sequential files.
  1286.  
  1287. This routine is potentially less secure than the Cipher routine
  1288. (see).
  1289.  
  1290. I'd suggest using a long password composed of an unlikely string
  1291. of characters, e.g. "#*@@!A^%x{.'".
  1292.  
  1293.    CipherP St$, Password$
  1294.  
  1295. St$        string to encrypt or decrypt
  1296. Password$  password
  1297. -------
  1298. St$        encrypted or decrypted string
  1299.  
  1300. Name  : ClearArea            (Clear a screen Area)
  1301. Class : Display
  1302. Level : Clone
  1303.  
  1304. This routine clears an area of the screen to a specified color.
  1305. The clearing is done by removing random characters until the
  1306. area is totally clear.
  1307.  
  1308.    ClearArea TRow%, LCol%, BRow%, RCol%, VAttr%, Fast%
  1309.  
  1310. TRow%       top row of area to clear
  1311. LCol%       left column of area to clear
  1312. BRow%       bottom row of area to clear
  1313. RCol%       right column of area to clear
  1314. VAttr%      color/attribute to clear to
  1315. Fast%       whether to use fast displays (0 no)
  1316.  
  1317. Name  : Clock                (Clock)
  1318. Class : Display / Time
  1319. Level : Clone
  1320.  
  1321. This routine allows you to turn a visible time display on or
  1322. off. When on, the time will be continuously displayed at a
  1323. selected location while your program continues processing. The
  1324. clock is managed as a background process, in effect doing some
  1325. simple multitasking.
  1326.  
  1327. You should turn the clock off before you terminate your program,
  1328. including any time you execute another program with RUN. The
  1329. clock can be safely kept on when you SHELL to another program,
  1330. however, as long as you can be sure that control will return to
  1331. your program when the other is done.
  1332.  
  1333. The clock must also be turned off if you change any of its
  1334. parameters with the ClockSet routine (see).
  1335.  
  1336. The clock will only be visible when the display is in text mode.
  1337. The use of PLAY or SOUND statements may shut off the clock,
  1338. depending on your version of the BASIC compiler.
  1339.  
  1340.    Clock DisplayOn%
  1341.  
  1342. DisplayOn%   whether to display the clock (0 if no)
  1343.  
  1344. Name  : ClockSet             (Clock Settings)
  1345. Class : Display / Time
  1346. Level : Clone
  1347.  
  1348. The ClockSet routine is used in conjunction with Clock (see). It
  1349. should only be used when the clock is turned off.
  1350.  
  1351. This routine allows you to set 12-hour or 24-hour time, whether
  1352. to display the seconds or not, how often to update the clock
  1353. display (in 1/18th seconds; 9 is usually the best choice), where
  1354. to display the clock and in what color, and whether to use
  1355. flicker-free displays (needed for cheap CGAs only). The defaults
  1356. are 12-hour time, display seconds, put the time (in white on
  1357. black) in the upper right corner, and display quickly (may
  1358. flicker on some CGAs).
  1359.  
  1360.    ClockSet Hours24%, Seconds%, Updates%, Row%, Column%, _
  1361.       VAttr%, Fast%
  1362.  
  1363. Hours24%   whether to display 24-hour time (0 if no)
  1364. Seconds%   whether to display seconds (0 if no)
  1365. Updates%   display update frequency in 1/18th seconds
  1366. Row%       row on which to display the clock
  1367. Col%       column at which to display the clock
  1368. VAttr%     color/attribute to use (see CalcAttr)
  1369. Fast%      whether to use fast mode (0 no)
  1370.  
  1371. Name  : CloseA               (Close Archive)
  1372. Class : Disk / Time
  1373. Level : DOS
  1374.  
  1375. This routine closes an archive opened by FindFirstA or
  1376. FindNextA. It must be used when you are done searching the
  1377. archive.
  1378.  
  1379. Routines in this series include:
  1380.    FindFirstA, FindNextA, GetNameA, GetCRCA, GetCRCAL,
  1381.    GetDateA, GetTimeA, GetSizeAL, GetStoreA
  1382.  
  1383.    CloseA
  1384.  
  1385. Name  : ClrCols              (Clear Columns)
  1386. Class : Display
  1387. Level : BIOS
  1388.  
  1389. This routine clears the current row between the specified
  1390. columns, inclusive. It does not affect the cursor position.
  1391.  
  1392.    ClrCols StartCol%, EndCol%
  1393.  
  1394. StartCol%  starting column
  1395. EndCol%    ending column
  1396.  
  1397. Name  : ClrEOL               (Clear to End Of Line)
  1398. Class : Display
  1399. Level : BIOS
  1400.  
  1401. This routine clears from the cursor to the end of the line,
  1402. inclusive. It does not affect the current cursor position.
  1403.  
  1404.    ClrEOL
  1405.  
  1406. Name  : ClrEOP               (Clear to End Of Page)
  1407. Class : Display
  1408. Level : BIOS
  1409.  
  1410. This routine clears from the cursor to the end of the display,
  1411. inclusive. It does not affect the current cursor position.
  1412.  
  1413.    ClrEOP
  1414.  
  1415. Name  : ClrKbd               (Clear Keyboard buffer)
  1416. Class : Input
  1417. Level : DOS
  1418.  
  1419. ClrKbd clears the keyboard buffer, discarding any keys that may
  1420. be waiting. This is a good idea for situations where an
  1421. unexpected input is made and you don't want to chance it being
  1422. answered accidentally by keys that were typed beforehand-- for
  1423. instance, in the event of an error or other condition where it
  1424. is important that the user see a message or take an action
  1425. before pressing a key.
  1426.  
  1427.    ClrKbd
  1428.  
  1429. Name  : ClrSOL               (Clear to Start Of Line)
  1430. Class : Display
  1431. Level : BIOS
  1432.  
  1433. This routine clears from the start of the line to the cursor,
  1434. inclusive. It does not affect the current cursor position.
  1435.  
  1436.    ClrSOL
  1437.  
  1438. Name  : ClrSOP               (Clear to Start Of Page)
  1439. Class : Display
  1440. Level : BIOS
  1441.  
  1442. This routine clears from the start of the display to the cursor,
  1443. inclusive. It does not affect the current cursor position.
  1444.  
  1445.    ClrSOP
  1446.  
  1447. Name  : Command2$            (Command line)
  1448. Class : Miscellaneous
  1449. Level : DOS
  1450.  
  1451. This function returns the original DOS command line. It works
  1452. like COMMAND$, but does not trim or capitalize the command line.
  1453.  
  1454. The area in which the command line is stored may be recycled for
  1455. other purposes, so you should use Command2$ as near to the start
  1456. of your program as possible.
  1457.  
  1458. NOTE that this function returns the actual command line. If you
  1459. use it in the editor/environment, it will return the command
  1460. line you used to start QB/QBX/VB-DOS, rather than any imitation
  1461. command line you installed while in the editor. The BASIC
  1462. editor/environment does not set the actual command line with
  1463. your choice, unfortunately-- it fakes out COMMAND$ instead. It
  1464. is not able to fool Command2$ in the same way.
  1465.  
  1466.    CmdLine$ = Command2$
  1467.  
  1468. -------
  1469. CmdLine$    original DOS command line
  1470.  
  1471. Name  : CopyFile             (Copy a File)
  1472. Class : Disk
  1473. Level : DOS
  1474.  
  1475. This works like the DOS COPY command, although it does not allow
  1476. wildcards. One file is copied to another, retaining the same
  1477. date and time. Full path specifications are supported, including
  1478. drive and subdirectory specs.
  1479.  
  1480. See also FileCopy, which supports wildcards.
  1481.  
  1482.    CopyFile FromFile$, ToFile$, ErrCode%
  1483.  
  1484. FromFile$   name of file to copy
  1485. ToFile$     name of new file to create
  1486. -------
  1487. ErrCode%    0 if no error, else DOS Error
  1488.  
  1489. Name  : CPrintScreen1        (CGA Print Screen [SCREEN 1])
  1490. Class : Display / Printer
  1491. Level : Clone
  1492.  
  1493. This routine dumps a SCREEN 1 display (CGA 320x200) to the
  1494. printer. It uses the stdprn device (normally PRN or LPT1) by
  1495. default, although this can be altered with the PrtSwap routine.
  1496.  
  1497.    CPrintScreen1
  1498.  
  1499. Name  : CPrintScreen2        (CGA Print Screen [SCREEN 2])
  1500. Class : Display / Printer
  1501. Level : Clone
  1502.  
  1503. This routine dumps a SCREEN 2 display (CGA 640x200) to the
  1504. printer. It uses the stdprn device (normally PRN or LPT1) by
  1505. default, although this can be altered with the PrtSwap routine.
  1506.  
  1507.    CPrintScreen2
  1508.  
  1509. Name  : CPUSpeed%            (CPU Speed)
  1510. Class : Equipment
  1511. Level : Clone
  1512.  
  1513. This function returns the approximate CPU speed in MHz. It may
  1514. take several seconds to find the speed of slower processors, so
  1515. don't expect an immediate response. Results can be skewed by
  1516. multitasking and background processing.
  1517.  
  1518.    MHz% = CPUSpeed%
  1519.  
  1520. -------
  1521. MHz%       approximate CPU speed
  1522.  
  1523. Name  : CRC                  (calculate CRC)
  1524. Class : String / Serial
  1525. Level : Any
  1526.  
  1527. This routine has become obsolete; the CRC1 routine is much
  1528. faster. However, CRC is still included for backwards
  1529. compatibility.
  1530.  
  1531. This routine calculates a complex 16-bit checksum, called a
  1532. Cyclical Redundancy Check (or CRC) on a string. The results are
  1533. compatible with Xmodem and Ymodem CRC routines. The CRC provides
  1534. a fairly reliable check of what characters are contained in the
  1535. string. See also Checksum.
  1536.  
  1537. If you are using this routine for Xmodem or Ymodem, note that
  1538. the string should be padded with two null characters before
  1539. calculating a "send" CRC: St$ = St$ + STRING$(2, 0). On receive,
  1540. you should calculate the CRC on the entire data block, plus the
  1541. received CRC; if the block was received correctly, the
  1542. calculated CRC will be zero in both lsb and msb.
  1543.  
  1544. Although Intel notation uses "lsb, msb" order, the Xmodem/Ymodem
  1545. CRC uses the opposite format, which is why the parameters are
  1546. ordered in this fashion.
  1547.  
  1548.    CRC St$, CRCmsb%, CRClsb%
  1549.  
  1550. St$       string to process
  1551. -------
  1552. CRCmsb%   most significant byte of CRC
  1553. CRClsb%   least significant byte of CRC
  1554.  
  1555. Name  : CRC1                 (calculate CRC)
  1556. Class : String / Serial
  1557. Level : Any
  1558.  
  1559. This routine calculates a complex 16-bit checksum, called a
  1560. Cyclical Redundancy Check (or CRC) on a string. The results are
  1561. compatible with Xmodem and Ymodem CRC routines. The CRC provides
  1562. a fairly reliable check of what characters are contained in the
  1563. string. See also Checksum.
  1564.  
  1565. Note that CRC1 does not work like the older CRC routine. You
  1566. should not pad outgoing strings with a STRING$(2, 0) sequence.
  1567.  
  1568. Although Intel notation uses "lsb, msb" order, the Xmodem/Ymodem
  1569. CRC uses the opposite format, which is why the parameters are
  1570. ordered in this fashion.
  1571.  
  1572.    CRC1 St$, CRCmsb%, CRClsb%
  1573.  
  1574. St$       string to process
  1575. -------
  1576. CRCmsb%   most significant byte of CRC
  1577. CRClsb%   least significant byte of CRC
  1578.  
  1579. Name  : CRC32Calc            (CRC 32-bit Calculation)
  1580. Class : String / Serial
  1581. Level : Any
  1582.  
  1583. This routine calculates a complex 32-bit checksum, called a
  1584. Cyclical Redundancy Check (or CRC) on a string. The results are
  1585. compatible with Zmodem CRC routines as well as those used by
  1586. popular archive utilities. The CRC provides a fairly reliable
  1587. check of what characters are contained in the string.
  1588.  
  1589. This routine must be used with two others. Before starting a CRC
  1590. calculation, call CRC32Init. You can then use CRC32Calc on one
  1591. or more strings for which you desire a CRC calculation. When
  1592. you're done, you call CRC32Done&, which returns the final
  1593. result. This approach allows you to calculate CRCs for data
  1594. which may be stored in more than one string.
  1595.  
  1596.    CRC32Calc St$
  1597.  
  1598. St$       string to process
  1599. -------
  1600.  
  1601. Name  : CRC32Done&           (CRC 32-bit Done)
  1602. Class : String / Serial
  1603. Level : Any
  1604.  
  1605. This routine returns the result of a 32-bit CRC calculation for
  1606. a string. See also CRC32Init and CRC32Calc.
  1607.  
  1608.    Result& = CRC32Done&
  1609.  
  1610. -------
  1611. Result&     32-bit CRC
  1612.  
  1613. Name  : CRC32Init            (CRC 32-bit Initialize)
  1614. Class : String / Serial
  1615. Level : Any
  1616.  
  1617. This routine initializes a 32-bit CRC calculation for a string.
  1618. See also CRC32Done& and CRC32Calc.
  1619.  
  1620.    CRC32Init
  1621.  
  1622. Name  : CreditCard$          (Credit Card validation)
  1623. Class : Miscellaneous
  1624. Level : Any
  1625.  
  1626. USE AT YOUR OWN RISK. This function has worked in my tests, but
  1627. I can't guarantee it will work for you. This is true of all
  1628. PBClone routines, but I feel it important to re-emphasize this
  1629. for this particular function. If you're not comfortable with
  1630. this lack of warranty, DON'T USE PBCLONE.
  1631.  
  1632. This function checks a credit card number for consistency, to
  1633. see if it is possibly valid. If the number seems reasonable, the
  1634. card type is returned as a four-character code:
  1635.  
  1636.    AMEX    American Express
  1637.    DINE    Diner's Club
  1638.    DISC    Discover
  1639.    MCAR    MasterCard
  1640.    VISA    Visa
  1641.  
  1642. Otherwise, a null string ("") is returned. The number is checked
  1643. according to length and self-consistency according to a
  1644. validation formula. Non-numeric characters are ignored.
  1645.  
  1646. NOTE that this function cannot ensure that a credit card number
  1647. -is- really valid. It can only tell you whether a card number is
  1648. -not- valid, to the best of its understanding. Its intended use
  1649. is in data-entry routines and similar operations which may
  1650. benefit from a "sanity check". *** USE AT YOUR OWN RISK ***
  1651.  
  1652.    CardName$ = CreditCard$(CardNumber$)
  1653.    IF LEN(CardName$) = 0 THEN PRINT "Error in card number"
  1654.  
  1655. CardNumber$    credit card number
  1656. -------
  1657. CardName$      type of credit card ("" if invalid)
  1658.  
  1659. Name  : Crunch               (Crunch repeated characters)
  1660. Class : String
  1661. Level : Any
  1662.  
  1663. It was hard to decide on a name for this routine, and I don't
  1664. know if I've done the best job. What Crunch does is to eliminate
  1665. repeated sequences of the same character. For instance, if you
  1666. gave it "This is a test" and asked it to crunch spaces, it would
  1667. return "This is a test". I use this to filter information from
  1668. the COMMAND$ function, but it's a good general purpose input
  1669. filter.
  1670.  
  1671.    Crunch St$, Ch$, StLen%
  1672.    St$ = LEFT$(St$, StLen%)
  1673.  
  1674. St$       string to be processed
  1675. Ch$       character to crunch out of the string
  1676. -------
  1677. St$       crunched string
  1678. StLen%    length of the crunched string
  1679.  
  1680. Name  : CtrlKey              (Control Key)
  1681. Class : Input
  1682. Level : Any
  1683.  
  1684. This routine works in conjunction with a key input routine, such
  1685. as INKEY$ or the CheckKey and GetKey routines. Given the ASCII
  1686. code of a key, CtrlKey returns the associated key letter, if
  1687. any. For instance, it returns "A" if you pass it ASCII code 1,
  1688. because that code represents Ctrl-A.
  1689.  
  1690.    CtrlKey ASCIICode%, Ky$
  1691.  
  1692. ASCIICode%   ASCII code of the key
  1693. -------
  1694. Ky$          associated key letter ("" if none)
  1695.  
  1696. Name  : CursorInfo           (Cursor Information)
  1697. Class : Input
  1698. Level : Clone
  1699.  
  1700. While BASIC allows you to set the size and shape of the cursor
  1701. with LOCATE, it's fairly hazardous to do so. There is no way to
  1702. find out the maximum size of the cursor, so your cursor may end
  1703. up a peculiar shape on some adapters. If you change the cursor
  1704. size or visibility in a subprogram, you may be screwing up the
  1705. main program.
  1706.  
  1707. CursorInfo offers a solution to these problems. It returns the
  1708. current cursor visibility and size, plus the maximum size
  1709. possible with the current video adapter. The minimum size will
  1710. always be zero, so it is not reported.
  1711.  
  1712.    CursorInfo Visible%, StartLine%, EndLine%, MaxLine%
  1713.  
  1714. -------
  1715. Visible%      whether the cursor is visible (0 no, 1 yes)
  1716. StartLine%    starting scan line of cursor
  1717. EndLine%      ending scan line of cursor
  1718. MaxLine%      maximum possible scan line for cursor
  1719.  
  1720. Name  : CWindowManager       (CGA Window Manager)
  1721. Class : Display
  1722. Level : Clone
  1723.  
  1724. CWindowManager displays a pop-up window on a CGA graphics
  1725. screen. It is intended for SCREEN 1, although it can be used on
  1726. SCREEN 2 as well (it will still have 40 columns and will display
  1727. shades rather than colors). The window may have any of a variety
  1728. of frames, a title, or a shadow, and it may appear instantly or
  1729. "grow" onto the screen.
  1730.  
  1731. These are the available frame types:
  1732.     0   no frame
  1733.     1   single lines
  1734.     2   double lines
  1735.     3   single horizontal, double vertical lines
  1736.     4   double horizontal, single vertical lines
  1737.     5   block graphic lines
  1738.  
  1739. Options for growing windows are as follows:
  1740.    -1   grow as fast as possible
  1741.     0   pop onto the screen
  1742.    1+   grow with delay given in milliseconds (15 works for me)
  1743.  
  1744. Note that this routine is different from its ProBas equivalent
  1745. in a number of respects. The grow delay time is different.
  1746. Growing is done more smoothly. The shadow and title parameters
  1747. are not changed by this routine. A new frame type (5) was added.
  1748. If a title is too long, it is truncated instead of being ignored
  1749. completely. Using a -1 as the title foreground color will not
  1750. turn off the title; instead, use a null title string.
  1751.  
  1752.    CWindowManager TRow%, LCol%, BRow%, RCol%, Frame%,
  1753.       Fore%, Back%, Grow%, Shade%, TFore%, Title$, Fast%
  1754.  
  1755. TRow%       top row of window
  1756. LCol%       left column of window
  1757. BRow%       bottom row of window
  1758. RCol%       right column of window
  1759. Frame%      frame type (see above)
  1760. Fore%       frame foreground color
  1761. Back%       frame background color
  1762. Grow%       window growing option (see above)
  1763. Shade%      window shadow option (0 for none)
  1764. TFore%      title foreground color
  1765. Title$      window title ("" if none)
  1766. Fast%       whether to use fast mode (0 no)
  1767.  
  1768. Name  : Cylinders%           (Cylinders)
  1769. Class : Disk
  1770. Level : DOS 3.3+
  1771.  
  1772. This function returns the number of cylinders for a given disk
  1773. drive. If the drive does not exist or is not a physical drive,
  1774. -1 will be returned. Note that the number of cylinders may be a
  1775. virtual number in some cases (such as drives compressed by the
  1776. DBLSPACE driver included with MS-DOS 6.0).
  1777.  
  1778. You may use "" to denote the current drive.
  1779.  
  1780.    Cyls% = Cylinders% (Drive$)
  1781.  
  1782. Drive$    drive for which to return cylinders
  1783. -------
  1784. Cyls%     number of cylinders (-1 if error)
  1785.  
  1786. Name  : DataSeg              (Data Segment)
  1787. Class : Memory
  1788. Level : Any
  1789.  
  1790. It's rare that you need to know the data segment used by BASIC,
  1791. but it does happen. DataSeg tells you that value. This is the
  1792. segment used by (near) strings, static arrays (except in the
  1793. QuickBASIC environment), some COMMON data, BASIC internal
  1794. variables and so forth. It is also the area specified by a plain
  1795. "DEF SEG", though not (usually) by "DEF SEG=xxxx".
  1796.  
  1797. There is also a function version of this routine, DataSeg2%.
  1798.  
  1799.    DataSeg DSeg%
  1800.  
  1801. -------
  1802. DSeg%     data segment for BASIC
  1803.  
  1804. Name  : DataSeg2%            (Data Segment)
  1805. Class : Memory
  1806. Level : Any
  1807.  
  1808. It's rare that you need to know the data segment used by BASIC,
  1809. but it does happen. DataSeg2% tells you that value. This is the
  1810. segment used by (near) strings, static arrays (except in the
  1811. QuickBASIC environment), some COMMON data, BASIC internal
  1812. variables and so forth. It is also the area specified by a plain
  1813. "DEF SEG", though not (usually) by "DEF SEG=xxxx".
  1814.  
  1815. There is also a sub version of this routine, DataSeg.
  1816.  
  1817.    DSeg% = DataSeg2%
  1818.  
  1819. -------
  1820. DSeg%     data segment for BASIC
  1821.  
  1822. Name  : Date2Int             (Date to Integer)
  1823. Class : Time
  1824. Level : Any
  1825.  
  1826. This routine compresses a date into a single integer. Note that
  1827. this integer is not in a format that lends itself to simple
  1828. computation-- you cannot subtract one from another to find out
  1829. the length of time between them. However, as long as the year is
  1830. in the range 1980-2042, you can compare the two integers to see
  1831. if one date is before or after another.
  1832.  
  1833. You may express the year as either a two-digit or four-digit
  1834. number.
  1835.  
  1836. The ProBas and PBClone versions of this routine do not work the
  1837. same way in regards to the year. ProBas assumed that any
  1838. two-digit year was in the 1900s. In contrast, PBClone assumes
  1839. that years 80-99 should be converted to 1980-1999 and that 0-79
  1840. should be converted to 2000-2079. I consider the PBClone method
  1841. more appropriate, with the turn of the century moving closer.
  1842. The date format used does not allow dates before 1980 anyway, so
  1843. nothing is being lost by this change.
  1844.  
  1845.    Date2Int MonthNr%, DayNr%, YearNr%, IntDate%
  1846.  
  1847. MonthNr%     month number (1-12)
  1848. DayNr%       day (1-31)
  1849. YearNr%      year (1980-2079; see above for two-digit years)
  1850. -------
  1851. IntDate%     date compressed into an integer
  1852.  
  1853. Name  : DateA2R              (Date Actual to Relative)
  1854. Class : Time
  1855. Level : Any
  1856.  
  1857. This routine converts an actual date to a relative date,
  1858. expressed as a number of days. This allows you to compare dates,
  1859. find out what the date will be in a given number of days (or
  1860. what it was a given number of days ago), see how many days
  1861. passed between two dates, and so forth.
  1862.  
  1863. I've frequently seen routines of this nature called "Julian
  1864. date" routines. I'm not sure where that nomenclature originated,
  1865. as it has nothing to do with the Julian calendar. Most of these
  1866. routines rely on approximations through floating point math, and
  1867. may or may not handle leap years and centuries appropriately.
  1868. The DateA2R routine takes no such shortcuts and may be relied
  1869. upon to return accurate results.
  1870.  
  1871.    DateA2R MonthNr%, DayNr%, YearNr%, RelDate&
  1872.  
  1873. MonthNr%     month number (1-12)
  1874. DayNr%       day number (1-31)
  1875. YearNr%      year number (1900 on; years <100 assumed in 1900s)
  1876. -------
  1877. RelDate&     relative date
  1878.  
  1879. Name  : DateN2S              (Date Numbers to String)
  1880. Class : Time
  1881. Level : Any / DOS
  1882.  
  1883. Many of the PBClone routines return the date as a set of
  1884. numbers. This routine provides an easy way to convert those
  1885. numbers into string form. The date format used (year length and
  1886. delimiter) will be based on the string which you pass to the
  1887. routine. For instance, "xx-xx-xxxx" will return a date like
  1888. "11-26-1990", whereas "xx.xx.xxxx" would return "11.26.1990",
  1889. and "xx/xx/xx" would return "11/26/90".
  1890.  
  1891. If you pass zeroes for the MonthNr%, DayNr%, and YearNr% values,
  1892. the current date will be returned in the format that you
  1893. specified.
  1894.  
  1895. The ProBas and PBClone versions of this routine do not work the
  1896. same way in regards to the year. ProBas assumed that any
  1897. two-digit year was in the 1900s. In contrast, PBClone assumes
  1898. that years 80-99 should be converted to 1980-1999 and that 0-79
  1899. should be converted to 2000-2079.
  1900.  
  1901.    DateSt$ = "xx-xx-xxxx"
  1902.    DateN2S MonthNr%, DayNr%, YearNr%, DateSt$
  1903.  
  1904. MonthNr%  month
  1905. DayNr%    day
  1906. YearNr%   year
  1907. -------
  1908. DateSt$   date string.  Init to 8 or 10 chars (see above).
  1909.  
  1910. Name  : DateR2A              (Date Relative to Actual)
  1911. Class : Time
  1912. Level : Any
  1913.  
  1914. This is the opposite of the DateA2R routine-- it takes a
  1915. "relative" date and converts it back to the usual form.
  1916.  
  1917.    DateR2A MonthNr%, DayNr%, YearNr%, RelDate&
  1918.  
  1919. RelDate&     relative date
  1920. -------
  1921. MonthNr%     month number (1-12)
  1922. DayNr%       day number (1-31)
  1923. YearNr%      year number (1900 on)
  1924.  
  1925. Name  : DateS2N              (Date String to Numbers)
  1926. Class : Time
  1927. Level : Any
  1928.  
  1929. Many of the PBClone routines need to be passed the date as a set
  1930. of numbers. This routine provides an easy way to convert a date
  1931. from string form into numbers. You may use either "xx/xx/xx" or
  1932. "xx-xx-xxxx" form to specify the date (the string length is
  1933. important, but the delimiter and contents of the string are
  1934. ignored).
  1935.  
  1936. The ProBas and PBClone versions of this routine do not work the
  1937. same way in regards to the year. ProBas assumed that any
  1938. two-digit year was in the 1900s. In contrast, PBClone assumes
  1939. that years 80-99 should be converted to 1980-1999 and that 0-79
  1940. should be converted to 2000-2079.
  1941.  
  1942.    DateS2N MonthNr%, DayNr%, YearNr%, DateSt$
  1943.  
  1944. DateSt$   date string.  Init to 8 or 10 characters (see above).
  1945. -------
  1946. MonthNr%  month
  1947. DayNr%    day
  1948. YearNr%   year
  1949.  
  1950. Name  : DblSpace%            (DBLSPACE check)
  1951. Class : Disk
  1952. Level : BIOS
  1953.  
  1954. This function returns whether DBLSPACE, the disk space doubler
  1955. that debuted in MS-DOS 6.0, is installed.
  1956.  
  1957.    Dbl% = DblSpace%
  1958.  
  1959. -------
  1960. Dbl%        whether DBLSPACE is installed (0 no, -1 yes)
  1961.  
  1962. Name  : DCal                 (Direct-to-memory Calendar)
  1963. Class : Time
  1964. Level : Any
  1965.  
  1966. This routine draws a calendar for a specific month and year. The
  1967. results are placed in an array which can be displayed using
  1968. ScrRest or the other PBClone routines to restore a screen image.
  1969.  
  1970. You must supply an integer array large enough to hold the image
  1971. generated by DCal, which expects a 25x80 screen. DIM Scrn%(1 TO
  1972. 2000) will do it. If you supply a null date, the current date
  1973. will be used.
  1974.  
  1975.    DCal Scrn%(), CalDate$
  1976.  
  1977. Scrn%()      array to hold screen image
  1978. CalDate$     date for the calendar
  1979. Page%        ignored
  1980. Fast%        ignored
  1981.  
  1982. Name  : DCalendar            (Direct-to-memory Calendar)
  1983. Class : Time
  1984. Level : Clone
  1985.  
  1986. This routine displays a calendar for a specific month and year.
  1987. It waits for input and acts accordingly, allowing the user to
  1988. move to different dates via the arrow keys or by entering the
  1989. date directly. The bottom row of the screen gives a list of the
  1990. available key commands.
  1991.  
  1992. Screen handling is largely done by writing to an array, then
  1993. dumping the entire array to the display with DScrRest. This
  1994. provides for very smooth displays. You must supply an integer
  1995. array large enough to hold the image generated by DCalendar,
  1996. which expects a 25x80 screen. DIM Scrn%(1 TO 2000) will do it.
  1997. Only text mode is supported by this routine.
  1998.  
  1999. If you supply a null date, the current date will be used.
  2000.  
  2001.    DCalendar Scrn%(), CalDate$, Page%, Fast%
  2002.  
  2003. Scrn%()      array to hold screen image
  2004. CalDate$     date for the calendar
  2005. Page%        page on which to display (normally zero)
  2006. Fast%        whether to use fast mode (0 no)
  2007.  
  2008. Name  : DClear               (Direct-to-memory Clear)
  2009. Class : Display
  2010. Level : Any
  2011.  
  2012. The DClear routine allows you to clear a text-mode display.
  2013.  
  2014. This routine does not necessarily work on the display itself.
  2015. Instead, it allows you to specify the memory location (segment
  2016. and offset) of the "screen", which may be an actual screen, a
  2017. saved screen in an array, a multitasker's virtual screen, etc.
  2018. Among other things, this makes it easy to work with two displays
  2019. at once: use a segment of &HB000 for the mono display and &HB800
  2020. for the color display (the offset in each case is zero).
  2021.  
  2022.    DClear DSeg%, DOfs%, VAttr%
  2023.  
  2024. DSeg%    segment of "screen" memory
  2025. DOfs%    offset of "screen" memory
  2026. VAttr%   color/attribute to use (see CalcAttr)
  2027.  
  2028. Name  : DClearSS             (Direct Clear for Specified Size)
  2029. Class : Display
  2030. Level : Any
  2031.  
  2032. Like the CLS statement, this routine allows you to clear a text
  2033. display. However, rather than clearing the actual screen,
  2034. DClearSS clears a screen that is stored in an array. This allows
  2035. you to design a screen in memory, then flash it onto the display
  2036. using PutScreen or a similar routine.
  2037.  
  2038. This routine is designed for a text screen of any specified
  2039. size.
  2040.  
  2041.    DClearSS DSeg%, DOfs%, VAttr%, Rows%, Columns%
  2042.  
  2043. DSeg%     segment of the array that holds the screen
  2044. DOfs%     offset of the array that holds the screen
  2045. VAttr%    color/attribute to use (see CalcAttr)
  2046. Rows%     length of the screen
  2047. Columns%  width of the screen
  2048.  
  2049. Name  : Dec2Any              (Decimal to Any base)
  2050. Class : Numeric
  2051. Level : Any
  2052.  
  2053. This routine converts a normal integer to a number in any base.
  2054. It works like the HEX$ function in BASIC, but rather than
  2055. working only in hexadecimal (base 16), it can be used for
  2056. binary, octal, or almost anything else.
  2057.  
  2058. The result will be right-justified in the string you provide. If
  2059. you use zeroes, this allows you to ignore the NumberLen% spec
  2060. and just trim the string to the desired length, leaving nothing
  2061. worse than possible leading zeroes.
  2062.  
  2063. The length needed by the return string will vary according to
  2064. the number, with a maximum length depending on the number base
  2065. chosen. For integers, this will be at most 16 characters (worst
  2066. case: base 2 or binary).
  2067.  
  2068.    Number$ = STRING$(16, "0")
  2069.    Dec2Any DecimalNr%, NrBase%, Number$, NumberLen%
  2070.    Number$ = RIGHT$(Number$, NumberLen%)
  2071.  
  2072. DecimalNr   integer to convert to another base
  2073. NrBase%     desired number base (2-31)
  2074. -------
  2075. Number$     resulting number in desired base (init >= 16 chars)
  2076. NumberLen%  length of the result (-1 if string too short)
  2077.  
  2078. Name  : Delay                (Delay for seconds)
  2079. Class : Time
  2080. Level : Clone
  2081.  
  2082. This routine delays for a given number of seconds. The timing
  2083. will be the same from an 8088 PC through an 80486 AT-- it's
  2084. entirely independent of the processor. See also Delay18th.
  2085.  
  2086.    Delay Seconds%
  2087.  
  2088. Seconds%   number of seconds for which to delay
  2089.  
  2090. Name  : Delay18th            (Delay for 1/18th seconds)
  2091. Class : Time
  2092. Level : Clone
  2093.  
  2094. This routine delays for a given number of 18ths of seconds. The
  2095. timing will be the same from an 8088 PC through an 80486 AT--
  2096. it's entirely independent of the processor. See also Delay.
  2097.  
  2098.    Delay WaitTime%
  2099.  
  2100. WaitTime%  number of 18ths of seconds for which to delay
  2101.  
  2102. Name  : DelayV               (Delay based on Video timing)
  2103. Class : Time
  2104. Level : Clone
  2105.  
  2106. This routine delays for a given number of milliseconds. The
  2107. timing is based on a signal from the video adapter and may vary
  2108. somewhat depending on the adapter. The delay is largely
  2109. independent of the cpu type and speed, however.
  2110.  
  2111. For anyone unfamiliar with the metric system: there are 1000
  2112. milliseconds in one second. Depending on the specific display
  2113. adapter, this routine may well be fairly inaccurate; it is
  2114. intended for providing small delays for animation and similar
  2115. purposes, not as a reliable timer.
  2116.  
  2117.    DelayV MilliSeconds%
  2118.  
  2119. MilliSeconds%   number of milliseconds for which to delay
  2120.  
  2121. Name  : DelChr               (Delete Character)
  2122. Class : Display
  2123. Level : Clone
  2124.  
  2125. The DelChr routine deletes the character at the specified screen
  2126. location.
  2127.  
  2128.    DelChr Row%, Column%
  2129.  
  2130. Row%      row of character
  2131. Column%   column of character
  2132.  
  2133. Name  : DelFile              (Delete File)
  2134. Class : Disk
  2135. Level : DOS
  2136.  
  2137. This works like the DOS DEL (or ERASE) command, although it does
  2138. not allow wildcards. The specified file is deleted. Full path
  2139. specifications are supported, including drive and subdirectory
  2140. specs.
  2141.  
  2142.    DelFile FileName$, ErrCode%
  2143.  
  2144. FileName$   name of the file to delete
  2145. -------
  2146. ErrCode%    0 if no error, else DOS Error
  2147.  
  2148. Name  : DelLine              (Delete Line)
  2149. Class : Display
  2150. Level : BIOS
  2151.  
  2152. This routine deletes the specified row from the screen.
  2153.  
  2154.    DelLine Row%, VAttr%
  2155.  
  2156. Row%      row to delete
  2157. VAttr%    color/attr to use on new bottom row (see CalcAttr)
  2158.  
  2159. Name  : DelSub               (Delete Subdirectory)
  2160. Class : Disk
  2161. Level : DOS
  2162.  
  2163. This works like the DOS RD (or RMDIR) command. It does not allow
  2164. wildcards. The specified subdirectory is deleted. Note that you
  2165. may not delete a subdirectory that you're located in, or a
  2166. subdirectory which contains files, or the root directory.
  2167.  
  2168.    DelSub SubDir$, ErrCode%
  2169.  
  2170. SubDir$     name of the subdirectory to delete
  2171. -------
  2172. ErrCode%    0 if no error, else DOS Error
  2173.  
  2174. Name  : DFRead               (Direct-to-memory File Read)
  2175. Class : Disk
  2176. Level : DOS
  2177.  
  2178. This routine reads data into an array from a file that was
  2179. opened by FOpen1 or FCreate. If it wasn't possible to read it
  2180. all from the file, an error code will be returned and the
  2181. BytesRead% value will tell you how many bytes were actually
  2182. read.
  2183.  
  2184.    DFRead Handle%, DSeg%, DOfs%, Bytes%, BytesRead%, ErrCode%
  2185.  
  2186. Handle%     handle of the file from which to read
  2187. DSeg%       segment of the array into which to read the file
  2188. DOfs%       offset of the array into which to read the file
  2189. Bytes%      number of bytes to read
  2190. -------
  2191. BytesWrit%  # of bytes actually read from the file (if error)
  2192. ErrCode%    error code: 0 if no error, else DOS Error
  2193.  
  2194. Name  : DFWrite              (Direct-from-memory File Write)
  2195. Class : Disk
  2196. Level : DOS
  2197.  
  2198. This routine writes data from an array to a file that was opened
  2199. by FOpen1 or FCreate. If it wasn't possible to write it all to
  2200. the file, an error code will be returned and the BytesWrit%
  2201. value will tell you how many bytes were actually written.
  2202.  
  2203.    DFWrite Handle%, DSeg%, DOfs%, Bytes%, BytesWrit%, ErrCode%
  2204.  
  2205. Handle%     handle of the file to which to write
  2206. DSeg%       segment of the data to write to the file
  2207. DOfs%       offset of the data to write to the file
  2208. Bytes%      number of bytes to write
  2209. -------
  2210. BytesWrit%  # of bytes actually written to the file (if error)
  2211. ErrCode%    error code: 0 if no error, else DOS Error
  2212.  
  2213. Name  : DGClear              (Direct-to-memory Graphics Clear)
  2214. Class : Display
  2215. Level : Any
  2216.  
  2217. This routine works like the CLS statement, clearing a CGA
  2218. graphics display. However, rather than clearing the actual
  2219. screen, DClearSS clears a screen that is stored in an array.
  2220. This allows you to design a screen in memory, then flash it onto
  2221. the display using GrafRest.
  2222.  
  2223. This routine is designed for use with SCREEN 1 or SCREEN 2 (CGA
  2224. graphics).
  2225.  
  2226.    DGClear DSeg%, DOfs%, Colour%
  2227.  
  2228. DSeg%     segment of the array that holds the screen
  2229. DOfs%     offset of the array that holds the screen
  2230. Colour%   color to use
  2231.  
  2232. Name  : DGetRec              (Direct-from-memory Get Record)
  2233. Class : String
  2234. Level : Clone
  2235.  
  2236. The DGetRec routine allows you to get a string from a specified
  2237. area of memory (numeric array, BIOS data area, display memory,
  2238. or whatever). The string should be initialized to the desired
  2239. record length in advance.
  2240.  
  2241. This works somewhat like an array of fixed length strings or a
  2242. random file, treating memory as a contiguous series of records
  2243. of a specified length.
  2244.  
  2245.    DGetRec DSeg%, DOfs%, RecNr%, St$
  2246.  
  2247. DSeg%      segment of the array to read from
  2248. DOfs%      offset of the array to read from
  2249. RecNr%     record number (starting at 1)
  2250. -------
  2251. St$        returned string.  Init to record length (see above).
  2252.  
  2253. Name  : DGetScreen           (Direct memory Get Screen image)
  2254. Class : Display
  2255. Level : Clone
  2256.  
  2257. This routine saves any portion of the display to an array. Only
  2258. text modes are supported. If your program uses multiple display
  2259. pages, you can get an image from any of those pages. A special
  2260. "slow" mode is supported for the CGA, to prevent flickering (a
  2261. problem only with some CGAs).
  2262.  
  2263. The size of the integer array needed to store a specific area of
  2264. the screen can be calculated using the CalcSize routine (see).
  2265.  
  2266. The GetScreen routine works the same way as this, but has a
  2267. simpler calling convention. Also, if you wish to save the entire
  2268. screen, you may find ScrSave easier.
  2269.  
  2270.    DGetScreen DSeg%, DOfs%, TRow%, LCol%, BRow%, RCol%,
  2271.       Page%, Fast%
  2272.  
  2273. DSeg%      segment of the array in which to store the image
  2274. DOfs%      offset of the array in which to store the image
  2275. TRow%      top row of the desired screen area
  2276. LCol%      left column of the desired screen area
  2277. BRow%      bottom row of the desired screen area
  2278. RCol%      right column of the desired screen area
  2279. Page%      page from which to get the display area
  2280. Fast%      whether to use fast mode (0 no)
  2281.  
  2282. Name  : DGetSt               (Direct-from-memory Get String)
  2283. Class : String
  2284. Level : Clone
  2285.  
  2286. The DGetSt routine allows you to get a string from a specified
  2287. area of memory (numeric array, BIOS data area, display memory,
  2288. or whatever). The string should be initialized to the desired
  2289. length in advance.
  2290.  
  2291. You may specify an additional offset from the initial location,
  2292. which itself is specified as a segment and an offset. The second
  2293. offset begins with position 1. The combined total of the two
  2294. offsets must be under 65,536. With normalized segment and offset
  2295. specifications, which is usually the case, this allows you to
  2296. specify a number from 1-65,521 for the second offset.
  2297.  
  2298.    DGetSt DSeg%, DOfs%, Posn&, St$
  2299.  
  2300. DSeg%      segment of the array to read from
  2301. DOfs%      offset of the array to read from
  2302. Posn&      location relative to the start of the array
  2303. -------
  2304. St$        returned string.  Init to # of chars desired.
  2305.  
  2306. Name  : DGQPrint             (Direct Graphics Quick Print)
  2307. Class : Display
  2308. Level : Any
  2309.  
  2310. This is a simple high-speed replacement for the PRINT statement
  2311. which works on a CGA virtual graphics screen (SCREEN 2). It does
  2312. not interpret control codes or support graphics characters
  2313. (ASCII 128-255).
  2314.  
  2315. DGQPrint allows you to display to a CGA even if it isn't the
  2316. active display (use a segment of &HB800 and offset of 0). Its
  2317. intended use, however, is to display to a virtual screen kept in
  2318. an array or other memory area. The results can then be displayed
  2319. using GrafRest.
  2320.  
  2321.    DGQPrint DSeg%, DOfs%, St$, Row%, Column%
  2322.  
  2323. DSeg%    segment of CGA virtual screen
  2324. DOfs%    offset of CGA virtual screen
  2325. St$      string to display
  2326. Row%     row (1-25)
  2327. Column%  column (1-80)
  2328.  
  2329. Name  : DGXQPrint            (Direct Graphics Extended Q Print)
  2330. Class : Display
  2331. Level : Any
  2332.  
  2333. This is a simple high-speed replacement for the PRINT statement
  2334. which works on a CGA virtual graphics screen (SCREEN 1). It does
  2335. not interpret control codes or support graphics characters
  2336. (ASCII 128-255).
  2337.  
  2338. This routine can also be used on a SCREEN 2 display, where it
  2339. will display the string in shades instead of in color (using 40
  2340. columns/row).
  2341.  
  2342. DGXQPrint allows you to display to a CGA even if it isn't the
  2343. active display (use a segment of &HB800 and offset of 0). Its
  2344. intended use, however, is to display to a virtual screen kept in
  2345. an array or other memory area. The results can then be displayed
  2346. using GrafRest.
  2347.  
  2348. The results of this routine are not redirectable by DOS.
  2349.  
  2350.    DGXQPrint DSeg%, DOfs%, St$, Row%, Column%, Fore%
  2351.  
  2352. DSeg%    segment of CGA virtual screen
  2353. DOfs%    offset of CGA virtual screen
  2354. St$      string to display
  2355. Row%     row (1-25)
  2356. Column%  column (1-40)
  2357. Fore%    foreground color (0-3)
  2358.  
  2359. Name  : DGXQPrint1           (Direct Graphics Extended Q Print)
  2360. Class : Display
  2361. Level : Any
  2362.  
  2363. This is a high-speed replacement for the PRINT statement which
  2364. works on a CGA virtual graphics screen (SCREEN 1). It does not
  2365. interpret control codes.
  2366.  
  2367. This routine can also be used on a SCREEN 2 display, where it
  2368. will display the string in shades instead of in color (using 40
  2369. columns/row).
  2370.  
  2371. DGXQPrint1 allows you to display to a CGA even if it isn't the
  2372. active display (use a segment of &HB800 and offset of 0). Its
  2373. intended use, however, is to display to a virtual screen kept in
  2374. an array or other memory area. The results can then be displayed
  2375. using GrafRest.
  2376.  
  2377. The results of this routine are not redirectable by DOS.
  2378.  
  2379.    DGXQPrint1 DSeg%, DOfs%, St$, Row%, Column%, Fore%, Back%
  2380.  
  2381. DSeg%    segment of CGA virtual screen
  2382. DOfs%    offset of CGA virtual screen
  2383. St$      string to display
  2384. Row%     row (1-25)
  2385. Column%  column (1-40)
  2386. Fore%    foreground color (0-3)
  2387. Back%    background color (0-3)
  2388.  
  2389. Name  : DInput               (Dollar Input)
  2390. Class : Input
  2391. Level : Clone
  2392.  
  2393. This routine provides formatted input of a dollar amount. You
  2394. specify the format and an initial value (may be zero). You may
  2395. also specify whether to allow negation-- if so, the user may
  2396. press the "-" key to toggle the number between negative and
  2397. positive. The numeric keypad will automatically be locked into
  2398. the numeric state. Since the decimal point is implicit, the "."
  2399. key functions as a delete or backspace operation, for convenient
  2400. one-handed data entry and correction.
  2401.  
  2402. The dollar amount is kept in a long integer as a number of
  2403. pennies, to avoid the possibility of round-off errors which
  2404. might result from use of floating point math. The results are
  2405. returned to you both as a long integer and as a formatted
  2406. number.
  2407.  
  2408. The format string works just like a PRINT USING format string.
  2409. Editing is not as flexible as for SInput, but is quite adequate.
  2410. The SInputSet routines will work for DInput as well as SInput.
  2411. The ExitCode% returned is the same as for SInput, but left and
  2412. right arrows may also be returned.
  2413.  
  2414.    DInput Format$, St&, St$, MinusOk%, VAttr%, ExitCode%
  2415.  
  2416. Format$    numeric format (just like PRINT USING format)
  2417. St&        dollar amount (in pennies)
  2418. MinusOk%   whether negation is allowed (0 if no)
  2419. VAttr%     color/attribute to use (see CalcAttr)
  2420. -------
  2421. St&        dollar amount (in pennies)
  2422. St$        formatted dollar amount
  2423. ExitCode%  key used to exit (ASCII code if +, scan code if -)
  2424.  
  2425. Name  : DiskStat             (Disk Statistics)
  2426. Class : Disk
  2427. Level : DOS
  2428.  
  2429. DiskStat gives you statistics on the memory usage of a specified
  2430. disk drive: the total number of clusters, the number of
  2431. available or free clusters, the number of sectors per cluster,
  2432. and the number of bytes per sector.
  2433.  
  2434. From this information, you can determine how much total disk
  2435. space there is, how much space is left and how much is used, the
  2436. size of a cluster, et al.
  2437.  
  2438. A few formulas for you:
  2439.  
  2440.    ClusterSize% = BytesPerSec% * SecsPerClus%
  2441.    FreeSpace& = FreeClus& * ClusterSize%
  2442.    TotalSpace& = TotalClus& * ClusterSize%
  2443.    UsedSpace& = TotalSpace& - FreeSpace&
  2444.  
  2445. A "cluster" is the minimum amount of disk space that can be
  2446. allocated at a time. A typical cluster size for a medium-sized
  2447. hard drive is 2048 bytes, which means that any file from 1-2048
  2448. bytes in length is actually taking up a full 2048 bytes on the
  2449. disk. Large cluster sizes improve file access times but can
  2450. waste a lot of disk space.
  2451.  
  2452.    DiskStat Drive$, FreeClus&, TotalClus&, BytesPerSec%,
  2453.       SecsPerClus%
  2454.  
  2455. Drive$        letter of the drive to examine
  2456. -------
  2457. FreeClus&     number of free or available clusters
  2458. TotalClus&    total number of clusters
  2459. BytesPerSec%  bytes per sector
  2460. SecsPerClus%  sectors per cluster (-1 if bad drive, etc)
  2461.  
  2462. Name  : Dissolve             (Dissolve)
  2463. Class : Display
  2464. Level : Clone
  2465.  
  2466. Like CLS, but a bit more fancy, this routine provides an
  2467. interesting way to clear the screen. See also FadeOut.
  2468.  
  2469. This routine may cause heavy flickering on some CGA displays.
  2470.  
  2471.    Dissolve VAttr%
  2472.  
  2473. VAttr%   color/attribute to which to clear (see CalcAttr)
  2474.  
  2475. Name  : DMPrint              (DOS Message Print)
  2476. Class : Display
  2477. Level : DOS
  2478.  
  2479. This routine is similar to PRINT, but goes through DOS output
  2480. services, which allows your program to support output
  2481. redirection, filters, CTTY and other handy things. See DOSInkey
  2482. for a DOS input service.
  2483.  
  2484. Note that the use of DMPrint means that you should avoid using
  2485. BASIC display handling (CLS, INPUT, LINE INPUT, PRINT, LOCATE,
  2486. CSRLIN, POS, etc). Instead, you should use ANSI escape sequences
  2487. to control the display. This requires that an ANSI driver (like
  2488. ANSI.SYS, DVANSI.SYS, NANSI.SYS, or ZANSI.SYS) be installed on
  2489. your system. See your DOS manual for details on ANSI sequences,
  2490. or grab the documentation on ANSI from one of your friendly
  2491. local BBSes.
  2492.  
  2493. It is -possible- to use BASIC display handling in conjunction
  2494. with DMPrint, but that tends to defeat the purpose of using
  2495. DMPrint in the first place.
  2496.  
  2497. Note that the DMPrint routine does not add a carriage
  2498. return/linefeed to the end of a string. If you want that, add
  2499. CHR$(13) + CHR$(10) to the end of the string.
  2500.  
  2501.    DMPrint St$
  2502.  
  2503. St$    string to display
  2504.  
  2505. Name  : DOSClrEol            (DOS Clear to End Of Line)
  2506. Class : Display
  2507. Level : DOS
  2508.  
  2509. This routine clears from the cursor position to the end of the
  2510. row using DOS output functions. It requires that ANSI.SYS or
  2511. another ANSI driver be installed.
  2512.  
  2513.    DOSClrEol
  2514.  
  2515. Name  : DOSCls               (DOS Clear Screen)
  2516. Class : Display
  2517. Level : DOS
  2518.  
  2519. This routine clears the screen using DOS output functions. It
  2520. requires that ANSI.SYS or another ANSI driver be installed.
  2521.  
  2522.    DOSCls
  2523.  
  2524. Name  : DOSColor             (DOS Color)
  2525. Class : Display
  2526. Level : DOS
  2527.  
  2528. This routine sets the screen colors using DOS output functions.
  2529. It requires that ANSI.SYS or another ANSI driver be installed.
  2530.  
  2531.    DOSColor Fore%, Back%
  2532.  
  2533. Fore%    foreground color
  2534. Back%    background color
  2535.  
  2536. Name  : DOSErrM$             (DOS Error Message)
  2537. Class : Miscellaneous
  2538. Level : DOS
  2539.  
  2540. Of the many PBClone routines that return error codes, most
  2541. simply pass the code back from DOS without any processing. You
  2542. can see what the codes mean by checking the chart in
  2543. PBClone.DOC, or it may be more convenient to use DOSErrM$
  2544. instead. This routine returns a short text description of the
  2545. error in question.
  2546.  
  2547.    ErrMsg$ = DOSErrM$(ErrCode%)
  2548.  
  2549. ErrCode%     error code to translate
  2550. -------
  2551. ErrMsg$      brief explanation of the error
  2552.  
  2553. Name  : DOSInkey             (DOS INKEY$)
  2554. Class : Input
  2555. Level : DOS
  2556.  
  2557. This routine is similar to INKEY$, but goes through DOS input
  2558. services, which allows your program to support input
  2559. redirection, filters, CTTY and other handy things. See DMPrint
  2560. for a DOS output service. See also DOSInky$.
  2561.  
  2562.    DOSInkey CharCode%, CharType%
  2563.  
  2564. -------
  2565. CharType%    0 if no key, 1 if normal key, 2 if extended key
  2566. CharCode%    ASCII code if normal key, scan code if extended key
  2567.  
  2568. Name  : DOSInky$             (DOS INKEY$)
  2569. Class : Input
  2570. Level : DOS
  2571.  
  2572. This routine works just like INKEY$, but goes through DOS input
  2573. services, which allows your program to support input
  2574. redirection, filters, CTTY and other handy things. See DMPrint
  2575. for a DOS output service. See also DOSInkey.
  2576.  
  2577.    ky$ = DOSInky$
  2578.  
  2579. -------
  2580. ky$      key, if any was waiting (0-2 chars/key, like INKEY$)
  2581.  
  2582. Name  : DOSInt%              (DOS Interrupt)
  2583. Class : Miscellaneous
  2584. Level : DOS
  2585.  
  2586. This routine provides you with easy access to DOS functions via
  2587. INT 21H, the major DOS interrupt. It works like the CALL
  2588. INTERRUPT routines provided with QuickBASIC but is easier to
  2589. use, at the expense of some flexibility.
  2590.  
  2591. CAUTION: This routine works directly with DOS, bypassing most of
  2592. BASIC's safety precautions. Possible chaos may result if you
  2593. don't know what you're doing! A few specific caveats:
  2594.  
  2595.    1) Do Not use this routine to exit your program or execute
  2596.       another. BASIC needs to clean up after itself before these
  2597.       tasks, and bypassing its handling is liable to make the
  2598.       system unstable at best.
  2599.  
  2600.    2) If you expect to use a string or array as a buffer, make
  2601.       sure it is long enough to handle the maximum amount of
  2602.       information anticipated. Strings and arrays can move about
  2603.       in memory, so be sure to get their addresses Just Before
  2604.       using DOSInt%.
  2605.  
  2606. If you wish to specify BASIC's data segment for DS, you can find
  2607. out what that is using the DataSeg routine (q.v.).
  2608.  
  2609. Normally, the CarryFlag% will be set if there is an error, in
  2610. which case AX will return the error code.
  2611.  
  2612.    CarryFlag% = DOSInt%(AX%, BX%, CX%, DX%, DS%)
  2613.  
  2614. AX%         desired setting of the AX register
  2615. BX%         desired setting of the BX register
  2616. CX%         desired setting of the CX register
  2617. DX%         desired setting of the DX register
  2618. DS%         desired setting of the DS and ES registers
  2619. -------
  2620. AX%         returned setting of the AX register
  2621. BX%         returned setting of the BX register
  2622. CX%         returned setting of the CX register
  2623. DX%         returned setting of the DX register
  2624. DS%         returned setting of the DS and ES registers
  2625. CarryFlag%  returned carry flag (0 no error, else code in AX)
  2626.  
  2627. Name  : DOSLocate            (DOS Locate)
  2628. Class : Display
  2629. Level : DOS
  2630.  
  2631. This routine sets the cursor position using DOS output
  2632. functions. It requires that ANSI.SYS or another ANSI driver be
  2633. installed.
  2634.  
  2635. Note that many ANSI drivers do not fully support EGA or VGA
  2636. modes in that they are limited to a maximum of 25 rows.
  2637.  
  2638.    DOSLocate Row%, Column%
  2639.  
  2640. Row%      row
  2641. Column%   column
  2642.  
  2643. Name  : DPutRec              (Direct-to-memory Put Record)
  2644. Class : String
  2645. Level : Clone
  2646.  
  2647. The DPutRec routine allows you to put a string into a specified
  2648. area of memory (numeric array, BIOS data area, display memory,
  2649. or whatever). The string should be initialized to the desired
  2650. record length in advance.
  2651.  
  2652. This works somewhat like an array of fixed length strings or a
  2653. random file, treating memory as a contiguous series of records
  2654. of a specified length.
  2655.  
  2656.    DPutRec DSeg%, DOfs%, RecNr%, St$
  2657.  
  2658. DSeg%      segment of the array to write into
  2659. DOfs%      offset of the array to write into
  2660. RecNr%     record number (starting at 1)
  2661. St$        string to write.  Init to record length (see above).
  2662.  
  2663. Name  : DPutScreen           (Direct-from-memory Put Screen)
  2664. Class : Display
  2665. Level : Clone
  2666.  
  2667. This routine restores a portion of the display (which was saved
  2668. to an array by DGetScreen or GetScreen) to the screen. Only text
  2669. modes are supported. If your program uses multiple display
  2670. pages, you can put the image onto any of those pages. A special
  2671. "slow" mode is supported for the CGA, to prevent flickering (a
  2672. problem only with some CGAs).
  2673.  
  2674. The PutScreen routine works the same way as this, but has a
  2675. simpler calling convention. Also, if you wish to restore the
  2676. entire screen, you may find ScrRest easier (see).
  2677.  
  2678.    DPutScreen DSeg%, DOfs%, TRow%, LCol%, BRow%, RCol%,
  2679.       Page%, Fast%
  2680.  
  2681. DSeg%      segment of the array from which to restore the image
  2682. DOfs%      offset of the array from which to restore the image
  2683. TRow%      top row of the desired screen area
  2684. LCol%      left column of the desired screen area
  2685. BRow%      bottom row of the desired screen area
  2686. RCol%      right column of the desired screen area
  2687. Page%      page on which to restore the display
  2688. Fast%      whether to use fast mode (0 no)
  2689.  
  2690. Name  : DPutSt               (Direct-to-memory Put String)
  2691. Class : String
  2692. Level : Clone
  2693.  
  2694. The DPutSt routine allows you to put a string into a specified
  2695. area of memory (numeric array, BIOS data area, display memory,
  2696. or whatever).
  2697.  
  2698. You may specify an additional offset from the initial location,
  2699. which itself is specified as a segment and an offset. The second
  2700. offset begins with position 1. The combined total of the two
  2701. offsets must be under 65,536. With normalized segment and offset
  2702. specifications, which is usually the case, this allows you to
  2703. specify a number from 1-65,521 for the second offset.
  2704.  
  2705.    DPutSt DSeg%, DOfs%, Posn&, St$
  2706.  
  2707. DSeg%      segment of the array to write to
  2708. DOfs%      offset of the array to write to
  2709. Posn&      location relative to the start of the array
  2710. St$        string to write into memory
  2711.  
  2712. Name  : DReadAbs             (Disk Read Absolute)
  2713. Class : Disk
  2714. Level : DOS
  2715.  
  2716. This routine reads an absolute disk sector. This is about as
  2717. low-level as you can get-- the disk is read directly at the byte
  2718. level, bypassing higher-level notions like filenames and
  2719. directories.
  2720.  
  2721. The DReadAbs routine works with any version of DOS, but will not
  2722. work properly with disk partitions of over 32 megabytes. If you
  2723. need to work with large disks, see the DReadAbsBig routine.
  2724.  
  2725. The results from the read will be stored in an array or other
  2726. memory area you specify. Be sure to make the area large enough
  2727. to hold everything! A sector is usually 512 bytes, but you can
  2728. use the DiskStat routine to make sure. Logical sector numbering
  2729. is used, with sector numbers beginning at zero.
  2730.  
  2731.    DReadAbs Drive$, Sector&, DSeg%, DOfs%, Sectors%, ErrCode%
  2732.  
  2733. Drive$     drive letter
  2734. Sector&    starting sector (0-65534 [or less on most disks])
  2735. DSeg%      segment of the array
  2736. DOfs%      offset of the array
  2737. Sectors%   number of sectors to read
  2738. -------
  2739. ErrCode%   error code (0 if no error, else DOS error code)
  2740.  
  2741. Name  : DReadAbsBig          (Disk Read Absolute, Big)
  2742. Class : Disk
  2743. Level : DOS
  2744.  
  2745. This routine reads an absolute disk sector. This is about as
  2746. low-level as you can get-- the disk is read directly at the byte
  2747. level, bypassing higher-level notions like filenames and
  2748. directories.
  2749.  
  2750. The DReadAbsBig routine works with DOS 3.31 and later. It will
  2751. work on disks of any size. If a limit of 32M is sufficient, you
  2752. might prefer the DReadAbs routine, which works with any DOS
  2753. version.
  2754.  
  2755. The results from the read will be stored in an array or other
  2756. memory area you specify. Be sure to make the area large enough
  2757. to hold everything! A sector is usually 512 bytes, but you can
  2758. use the DiskStat routine to make sure. Logical sector numbering
  2759. is used, with sector numbers beginning at zero.
  2760.  
  2761.    DReadAbsBig Driv$, Sector&, DSeg%, DOfs%, Sectors%, ErrCode%
  2762.  
  2763. Driv$      drive letter
  2764. Sector&    starting sector (0-65534 [or less on most disks])
  2765. DSeg%      segment of the array
  2766. DOfs%      offset of the array
  2767. Sectors%   number of sectors to read
  2768. -------
  2769. ErrCode%   error code (0 if no error, else DOS error code)
  2770.  
  2771. Name  : DRecDel              (Direct-to-memory Record Deletion)
  2772. Class : Array management
  2773. Level : Any
  2774.  
  2775. This routine allows you to delete an item from an array. The
  2776. item may consist of one or more array elements. The size of the
  2777. array isn't actually changed, but the array elements are moved
  2778. as if a deletion took place.
  2779.  
  2780.    DRecDel DSeg%, DOfs%, RecNr%, RecLen%, Records%
  2781.  
  2782. DSeg%      segment of the array
  2783. DOfs%      offset of the array
  2784. RecNr%     record/element number (starting at 1)
  2785. RecLen%    record/element length in bytes
  2786. Records%   total number of records/elements in the array
  2787.  
  2788. Name  : DRecIns              (Direct-to-mem Record Insertion)
  2789. Class : Array management
  2790. Level : Any
  2791.  
  2792. This routine allows you to insert an item into an array. The
  2793. item may consist of one or more array elements. The size of the
  2794. array isn't actually changed, but the array elements are moved
  2795. as if an insertion took place. You must of course make sure that
  2796. the array is DIMed large enough to handle this.
  2797.  
  2798.    DRecIns DSeg%, DOfs%, RecNr%, RecLen%, Records%
  2799.  
  2800. DSeg%      segment of the array
  2801. DOfs%      offset of the array
  2802. RecNr%     record/element number (starting at 1)
  2803. RecLen%    record/element length in bytes
  2804. Records%   total number of records/elements in the array
  2805.  
  2806. Name  : DRecolor             (Direct-to-memory Recolor)
  2807. Class : Display
  2808. Level : Any
  2809.  
  2810. The DRecolor routine changes all text in one color to another
  2811. color. It works only in text modes. The colors are specified as
  2812. attributes (see CalcAttr).
  2813.  
  2814. This routine does not necessarily work on the display itself.
  2815. Instead, it allows you to specify the memory location (segment
  2816. and offset) of the "screen", which may be an actual screen, a
  2817. saved screen in an array, a multitasker's virtual screen, etc.
  2818. Among other things, this makes it easy to work with two displays
  2819. at once: use a segment of &HB000 for the mono display and &HB800
  2820. for the color display (the offset in each case is zero).
  2821.  
  2822.    DRecolor DSeg%, DOfs%, OldAttr%, NewAttr%
  2823.  
  2824. DSeg%      segment of "screen" memory
  2825. DOfs%      offset of "screen" memory
  2826. OldAttr%   color to be changed
  2827. NewAttr%   color to which to change
  2828.  
  2829. Name  : DRecolorArea         (Direct-to-memory Recolor Area)
  2830. Class : Display
  2831. Level : Clone
  2832.  
  2833. The DRecolorArea routine changes a specified area of the screen
  2834. to a specified color. It works only in text modes. The color is
  2835. specified as an attribute (see CalcAttr).
  2836.  
  2837. One of the more common applications for this routine is marking
  2838. an area of the screen, e.g. menu highlight bars.
  2839.  
  2840.    DRecolorArea DSeg%, DOfs%, TRow%, LCol%, BRow%, RCol%, _
  2841.      VAttr%
  2842.  
  2843. This routine does not necessarily work on the display itself.
  2844. Instead, it allows you to specify the memory location (segment
  2845. and offset) of the "screen", which may be an actual screen, a
  2846. saved screen in an array, a multitasker's virtual screen, etc.
  2847. Among other things, this makes it easy to work with two displays
  2848. at once: use a segment of &HB000 for the mono display and &HB800
  2849. for the color display (the offset in each case is zero).
  2850.  
  2851. DSeg%       segment of "screen" memory
  2852. DOfs%       offset of "screen" memory
  2853. TRow%       top row of area to recolor
  2854. LCol%       left column of area to recolor
  2855. BRow%       bottom row of area to recolor
  2856. RCol%       right column of area to recolor
  2857. VAttr%      desired color
  2858.  
  2859. Name  : DriveSpace&          (Drive Space free)
  2860. Class : Disk
  2861. Level : DOS
  2862.  
  2863. This routine tells you how many bytes are free on a specified
  2864. disk drive.
  2865.  
  2866.    BytesFree& = DriveSpace&(Drive$)
  2867.  
  2868. Drive$      letter of the drive to examine
  2869. -------
  2870. BytesFree&  free bytes on the specified drive, or -1 if error
  2871.  
  2872. Name  : DrvSpaceL            (Drive Space free as Long integer)
  2873. Class : Disk
  2874. Level : DOS
  2875.  
  2876. This routine tells you how many bytes are free on a specified
  2877. disk drive. See also DriveSpace, a function-type version of this
  2878. routine.
  2879.  
  2880.    DrvSpaceL Drive$, BytesFree&
  2881.  
  2882. Drive$      letter of the drive to examine
  2883. -------
  2884. BytesFree&  free bytes on the specified drive, or -1 if error
  2885.  
  2886. Name  : DrvType              (Drive Type)
  2887. Class : Disk
  2888. Level : DOS 3.1+
  2889.  
  2890. The DrvType routine tells you whether a specified drive is fixed
  2891. or removable, and whether it is local or a remote (network)
  2892. drive. Since NetWare doesn't intercept the appropriate DOS call,
  2893. DrvType now tests for NetWare and uses its calls for the local
  2894. vs remote info if possible. The local/remote info may not be
  2895. accurate with networks other than NetWare and Microsoft.
  2896.  
  2897. Microsoft's ubiquitous MSCDEX driver for CD-ROM drives presents
  2898. some intriguing anomalies. It pretends that CD-ROMs are fixed,
  2899. remote devices. Some MSCDEX versions also return an error flag
  2900. for CD-ROM drives for no apparent reason. I've revised error
  2901. checking accordingly, so this should not present a problem with
  2902. the current DrvType routine.
  2903.  
  2904.    DrvType Drive$, Removable%, Remote%, ErrCode%
  2905.  
  2906. Drive$       letter of the drive to examine
  2907. -------
  2908. Removable%   whether the disk can be removed (0 if no)
  2909. Remote%      whether this is a remote drive (0 if no)
  2910. ErrCode%     error code: 0 if none, else DOS error
  2911.  
  2912. Name  : DScrRest             (Direct-from-mem Screen Restore)
  2913. Class : Display
  2914. Level : Clone
  2915.  
  2916. The DScrRest routine restores a display that was saved using
  2917. ScrSave or a similar routine. It only works in text modes. See
  2918. also ScrRest.
  2919.  
  2920.    DScrRest DSeg%, DOfs%, Page%, Fast%
  2921.  
  2922. DSeg%      segment of info to restore to the screen
  2923. DOfs%      offset of info to restore to the screen
  2924. Page%      page on which to restore the display
  2925. Fast%      whether to use fast mode (0 no)
  2926.  
  2927. Name  : DScrSave             (Direct-from-memory Screen Save)
  2928. Class : Display
  2929. Level : Clone
  2930.  
  2931. The DScrSave routine saves the display to an array or other
  2932. storage area. Only text modes are supported. For an 80x25
  2933. display, the array must hold 4,000 bytes (4,000 string
  2934. characters or 2,000 integers). See also ScrSave.
  2935.  
  2936.    DScrSave DSeg%, DOfs%, Page%, Fast%
  2937.  
  2938. DSeg%      segment of place to store the display
  2939. DOfs%      offset of place to store the display
  2940. Page%      page from which to get the display
  2941. Fast%      whether to use fast mode (0 no)
  2942.  
  2943. Name  : DTR                  (Data Terminal Ready signal)
  2944. Class : Serial
  2945. Level : Clone
  2946.  
  2947. Just as IBM provided the standard for personal computers, Hayes
  2948. provided the standard for modem commands. Unfortunately, the
  2949. command method of dropping carrier (hanging up the phone) was
  2950. badly designed, and all Hayes-compatible modems have a hard time
  2951. recognizing that command under certain line conditions.
  2952.  
  2953. Fortunately, there's a more reliable way of hanging up: the DTR
  2954. serial signal. Turning this signal off will cause the modem to
  2955. hang up very quickly. Most Hayes-compatible modems are
  2956. factory-set to pay attention to the DTR; those that aren't can
  2957. be made to do so either by flipping a hardware switch or with a
  2958. special initialization command. See your modem manual for
  2959. details.
  2960.  
  2961. BASIC will drop the DTR when you CLOSE the comm port, but this
  2962. isn't always a convenient way to do it. As a matter of fact,
  2963. this can be a decided nuisance, so many people have patched
  2964. their version of BASIC to avoid it. If you would like to do so,
  2965. check your local BBS for the method! With the PBClone DTR
  2966. routine, you can get full control over the DTR without having to
  2967. CLOSE the comm port.
  2968.  
  2969. Note: it may be wise to include a brief delay after dropping the
  2970. DTR, to give the modem a chance to react. Try Delay18th (see)
  2971. with a wait of around 4.
  2972.  
  2973.    DTR CommPort%, TurnOn%
  2974.  
  2975. CommPort%    serial port (1-4, though BASIC only handles 1-2)
  2976. TurnOn%      whether to raise (turn on) the DTR (0 if no)
  2977.  
  2978. Name  : DupeVar              (Duplicate Variable)
  2979. Class : Miscellaneous
  2980. Level : Any
  2981.  
  2982. This routine allows you to copy the contents of one variable
  2983. into another, even if the variables are not of the same type.
  2984. You may specify any variable type EXCEPT variable-length
  2985. strings: integer, long integer, single, double, fixed-length
  2986. string, TYPEd variable, etc.
  2987.  
  2988. Most languages that provide TYPEd variables also provide for
  2989. variant records, that is, more than one way of looking at the
  2990. same information. Curiously, BASIC doesn't. This routine allows
  2991. you to map one variable into another, essentially providing the
  2992. lacking capability.
  2993.  
  2994. The only caveat for DupeVar is that both variables must be the
  2995. same length in bytes.
  2996.  
  2997.    DupeVar FromVar, ToVar
  2998.  
  2999. FromVar     variable from which to copy
  3000. -------
  3001. ToVar       variable to which to copy
  3002.  
  3003. Name  : DWindowMan2          (Direct-to-memory Window Manager)
  3004. Class : Display
  3005. Level : Any
  3006.  
  3007. This routine is identical to DWindowManager but for the fact
  3008. that it allows you to design your own custom window frames.
  3009. Please see the description of DWindowManager for general
  3010. information.
  3011.  
  3012. These are the additional frame types:
  3013.     6   custom frame composed of a single character
  3014.     7   custom frame composed of the specified 7-character list:
  3015.         top left corner, top middle, top right corner,
  3016.         left middle, right middle,
  3017.         bottom left corner, bottom middle, bottom right corner
  3018.  
  3019.  /------------------------------------------------------------\
  3020.  | A custom frame like this would be defined as frame type 7, |
  3021.  | with a frame string of "/-\||\-/", for instance.           |
  3022.  \------------------------------------------------------------/
  3023.  
  3024.  *************************************************
  3025.  * On the other hand, a frame like this would be *
  3026.  * frame type 6, with a frame string of "*".     *
  3027.  *************************************************
  3028.  
  3029. Note that this routine differs from the ProBas equivalent in
  3030. that it supports full frame definitions through frame type 7.
  3031. Differences mentioned under WindowManager are also relevant.
  3032.  
  3033.    DWindowMan2 DSeg%, DOfs%, TRow%, LCol%, BRow%, RCol%,
  3034.       Frame%, FSt$, Fore%, Back%, Grow%, Shade%, TFore%, Title$
  3035.  
  3036. DSeg%       segment of "screen" memory
  3037. DOfs%       offset of "screen" memory
  3038. TRow%       top row of window
  3039. LCol%       left column of window
  3040. BRow%       bottom row of window
  3041. RCol%       right column of window
  3042. Frame%      frame type (see above)
  3043. FSt$        frame definition string (see above)
  3044. Fore%       frame foreground color
  3045. Back%       frame background color
  3046. Grow%       window growing option (see above)
  3047. Shade%      window shadow option (see above)
  3048. TFore%      title foreground color
  3049. Title$      window title ("" if none)
  3050.  
  3051. Name  : DWindowMan3          (Direct-to-memory Window Manager)
  3052. Class : Display
  3053. Level : Any
  3054.  
  3055. This routine is identical in function to DWindowManager. The
  3056. parameters are mostly passed as an array, however, instead of
  3057. one by one. Please see the description of DWindowManager for
  3058. general information.
  3059.  
  3060.    DWindowMan3 Parm%(), Title$
  3061.  
  3062. DSeg%       segment of "screen" memory
  3063. DOfs%       offset of "screen" memory
  3064. Parm%(1)    top row of window
  3065. Parm%(2)    left column of window
  3066. Parm%(3)    bottom row of window
  3067. Parm%(4)    right column of window
  3068. Parm%(5)    frame type (see above)
  3069. Parm%(6)    frame foreground color
  3070. Parm%(7)    frame background color
  3071. Parm%(8)    window growing option (see above)
  3072. Parm%(9)    window shadow option (see above)
  3073. Parm%(10)   title foreground color
  3074. Title$      window title ("" if none)
  3075.  
  3076. Name  : DWindowMan4          (Direct-to-memory Window Manager)
  3077. Class : Display
  3078. Level : Any
  3079.  
  3080. This is an extremely cut-down version of DWindowManager,
  3081. providing no more than a simple frame generator.
  3082.  
  3083. These are the available frame types:
  3084.     0   no frame
  3085.     1   single lines
  3086.     2   double lines
  3087.     3   single horizontal, double vertical lines
  3088.     4   double horizontal, single vertical lines
  3089.     5   block graphic lines
  3090.  
  3091.    DWindowMan4 DSeg%, DOfs%, TRow%, LCol%, BRow%, RCol%, _
  3092.       Frame%, VAttr%
  3093.  
  3094. DSeg%       segment of "screen" memory
  3095. DOfs%       offset of "screen" memory
  3096. TRow%       top row of window
  3097. LCol%       left column of window
  3098. BRow%       bottom row of window
  3099. RCol%       right column of window
  3100. Frame%      frame type (see above)
  3101. VAttr%      frame color/attribute (use CalcAttr)
  3102.  
  3103. Name  : DWindowManager       (Direct-to-memory Window Manager)
  3104. Class : Display
  3105. Level : Any
  3106.  
  3107. DWindowManager displays a pop-up window according to your
  3108. specifications. The window may have any of a variety of frames,
  3109. a title, or a shadow, and it may appear instantly or "grow" onto
  3110. the screen.
  3111.  
  3112. These are the available frame types:
  3113.     0   no frame
  3114.     1   single lines
  3115.     2   double lines
  3116.     3   single horizontal, double vertical lines
  3117.     4   double horizontal, single vertical lines
  3118.     5   block graphic lines
  3119.  
  3120. These are the available shadows:
  3121.    -3   transparent shadow on the right
  3122.    -2   transparent shadow on the left
  3123.    -1   solid black shadow on the left
  3124.     0   no shadow
  3125.    1+   shadow attribute (use CalcAttr) for a colored shadow
  3126.  
  3127. Options for growing windows are as follows:
  3128.    -1   grow as fast as possible
  3129.     0   pop onto the screen
  3130.    1+   grow with delay given in milliseconds (15 works for me)
  3131.  
  3132. Note that this routine is different from its ProBas equivalent
  3133. in a number of respects. The grow delay time is different.
  3134. Growing is done more smoothly. The shadow and title parameters
  3135. are not changed by this routine. A new frame type (5) was added.
  3136. If a title is too long, it is truncated instead of being ignored
  3137. completely. Using a -1 as the title foreground color will not
  3138. turn off the title; instead, use a null title string.
  3139.  
  3140.    DWindowManager DSeg%, DOfs%, TRow%, LCol%, BRow%, RCol%,
  3141.       Frame%, Fore%, Back%, Grow%, Shade%, TFore%, Title$
  3142.  
  3143. This routine does not necessarily work on the display itself.
  3144. Instead, it allows you to specify the memory location (segment
  3145. and offset) of the "screen", which may be an actual screen, a
  3146. saved screen in an array, a multitasker's virtual screen, etc.
  3147. Among other things, this makes it easy to work with two displays
  3148. at once: use a segment of &HB000 for the mono display and &HB800
  3149. for the color display (the offset in each case is zero).
  3150.  
  3151. DSeg%       segment of "screen" memory
  3152. DOfs%       offset of "screen" memory
  3153. TRow%       top row of window
  3154. LCol%       left column of window
  3155. BRow%       bottom row of window
  3156. RCol%       right column of window
  3157. Frame%      frame type (see above)
  3158. Fore%       frame foreground color
  3159. Back%       frame background color
  3160. Grow%       window growing option (see above)
  3161. Shade%      window shadow option (see above)
  3162. TFore%      title foreground color
  3163. Title$      window title ("" if none)
  3164.  
  3165. Name  : DWriteAbs             (Disk Write Absolute)
  3166. Class : Disk
  3167. Level : DOS
  3168.  
  3169. This routine writes an absolute disk sector. This is about as
  3170. low-level as you can get-- the disk is written directly at the
  3171. byte level, bypassing higher-level notions like filenames and
  3172. directories. This is DANGEROUS! If you screw up, DOS may not be
  3173. able to read the disk any more, and it may need to be
  3174. reformatted. Back up your data before trying this routine!
  3175.  
  3176. The DWriteAbs routine works with any version of DOS, but will
  3177. not work properly with disk partitions of over 32 megabytes. If
  3178. you need to work with large disks, see the DWriteAbsBig routine.
  3179.  
  3180. The write will be done from an array or other memory area you
  3181. specify. Be sure to make the area the right size! A sector is
  3182. usually 512 bytes, but you can use the DiskStat routine to make
  3183. sure. Logical sector numbering is used, with sector numbers
  3184. beginning at zero.
  3185.  
  3186.    DWriteAbs Drive$, Sector&, DSeg%, DOfs%, Sectors%, ErrCode%
  3187.  
  3188. Drive$     drive letter
  3189. Sector&    starting sector (0-65534 [or less on most disks])
  3190. DSeg%      segment of the array
  3191. DOfs%      offset of the array
  3192. Sectors%   number of sectors to write
  3193. -------
  3194. ErrCode%   error code (0 if no error, else DOS error code)
  3195.  
  3196. Name  : DWriteAbsBig          (Disk Write Absolute, Big)
  3197. Class : Disk
  3198. Level : DOS
  3199.  
  3200. This routine writes an absolute disk sector. This is about as
  3201. low-level as you can get-- the disk is written directly at the
  3202. byte level, bypassing higher-level notions like filenames and
  3203. directories. This is DANGEROUS! If you screw up, DOS may not be
  3204. able to read the disk any more, and it may need to be
  3205. reformatted. Back up your data before trying this routine!
  3206.  
  3207. The DWriteAbsBig routine works with DOS 3.31 and later. It will
  3208. work on disks of any size. If a limit of 32M is sufficient, you
  3209. might prefer the DWriteAbs routine, which works with any DOS
  3210. version.
  3211.  
  3212. The write will be done from an array or other memory area you
  3213. specify. Be sure to make the area the right size! A sector is
  3214. usually 512 bytes, but you can use the DiskStat routine to make
  3215. sure. Logical sector numbering is used, with sector numbers
  3216. beginning at zero.
  3217.  
  3218.    DWriteAbsBig Drv$, Sector&, DSeg%, DOfs%, Sectors%, ErrCode%
  3219.  
  3220. Drv$       drive letter
  3221. Sector&    starting sector (0-65534 [or less on most disks])
  3222. DSeg%      segment of the array
  3223. DOfs%      offset of the array
  3224. Sectors%   number of sectors to write
  3225. -------
  3226. ErrCode%   error code (0 if no error, else DOS error code)
  3227.  
  3228. Name  : DXQPrint             (Direct Extended Quick Print)
  3229. Class : Display
  3230. Level : Any
  3231.  
  3232. This routine provides a rather crude, but very fast, display
  3233. capability. It works like the PRINT statement in BASIC, except
  3234. that it doesn't move the cursor or process control codes. It
  3235. works only in text modes.
  3236.  
  3237. This routine does not necessarily work on the display itself.
  3238. Instead, it allows you to specify the memory location (segment
  3239. and offset) of the "screen", which may be an actual screen, a
  3240. saved screen in an array, a multitasker's virtual screen, etc.
  3241. Among other things, this makes it easy to work with two displays
  3242. at once: use a segment of &HB000 for the mono display and &HB800
  3243. for the color display (the offset in each case is zero).
  3244.  
  3245. The results of this routine are not redirectable by DOS.
  3246.  
  3247.    DXQPrint DSeg%, DOfs%, St$, Row%, Column%, VAttr%
  3248.  
  3249. DSeg%     segment of "screen" memory
  3250. DOfs%     offset of "screen" memory
  3251. St$       string to display
  3252. Row%      starting row
  3253. Column%   starting column
  3254. VAttr%    color/attribute (see CalcAttr)
  3255.  
  3256. Name  : EGARest7             (EGA Restore for SCREEN 7)
  3257. Class : Display
  3258. Level : Clone
  3259.  
  3260. This routine allows you to restore a SCREEN 7 (EGA, 320x200, 16
  3261. color) display that was saved using EGASave7 (see).
  3262.  
  3263.    EGARest7 DSeg%, DOfs%
  3264.  
  3265. DSeg%        segment of storage array, returned by VARSEG
  3266. DOfs%        offset  of storage array, returned by VARPTR
  3267.  
  3268. Name  : EGARest8             (EGA Restore for SCREEN 8)
  3269. Class : Display
  3270. Level : Clone
  3271.  
  3272. This routine allows you to restore a SCREEN 8 (EGA, 640x200, 16
  3273. color) display that was saved using EGASave8 (see).
  3274.  
  3275.    EGARest8 DSeg%, DOfs%
  3276.  
  3277. DSeg%        segment of storage array, returned by VARSEG
  3278. DOfs%        offset  of storage array, returned by VARPTR
  3279.  
  3280. Name  : EGARest9             (EGA Restore for SCREEN 9)
  3281. Class : Display
  3282. Level : Clone
  3283.  
  3284. This routine allows you to restore a SCREEN 9 (EGA, 640x350, 16
  3285. color) display that was saved using EGASave9 (see).
  3286.  
  3287.    EGARest9 DSeg1%, DOfs1%, DSeg2%, DOfs2%
  3288.  
  3289. DSeg1%       segment of storage array #1, returned by VARSEG
  3290. DOfs1%       offset  of storage array #1, returned by VARPTR
  3291. DSeg2%       segment of storage array #2, returned by VARSEG
  3292. DOfs2%       offset  of storage array #2, returned by VARPTR
  3293.  
  3294. Name  : EGASave7             (EGA Save for SCREEN 7)
  3295. Class : Display
  3296. Level : Clone
  3297.  
  3298. This routine allows you to save a SCREEN 7 (EGA, 320x200, 16
  3299. color) display that can be restored using EGARest7 (see).
  3300.  
  3301. The array used to hold the screen must contain 32,000 bytes. For
  3302. an integer array, this means that you must create the array by
  3303. DIM Array%(1 TO 16000).
  3304.  
  3305.    EGASave7 DSeg%, DOfs%
  3306.  
  3307. DSeg%        segment of storage array, returned by VARSEG
  3308. DOfs%        offset  of storage array, returned by VARPTR
  3309.  
  3310. Name  : EGASave8             (EGA Save for SCREEN 8)
  3311. Class : Display
  3312. Level : Clone
  3313.  
  3314. This routine allows you to save a SCREEN 8 (EGA, 640x200, 16
  3315. color) display that can be restored using EGARest8 (see).
  3316.  
  3317. The array used to hold the screen must contain 64,000 bytes. For
  3318. an integer array, this means that you must create the array by
  3319. DIM Array%(1 TO 32000).
  3320.  
  3321.    EGASave8 DSeg%, DOfs%
  3322.  
  3323. DSeg%        segment of storage array, returned by VARSEG
  3324. DOfs%        offset  of storage array, returned by VARPTR
  3325.  
  3326. Name  : EGASave9             (EGA Save for SCREEN 9)
  3327. Class : Display
  3328. Level : Clone
  3329.  
  3330. This routine allows you to save a SCREEN 9 (EGA, 640x350, 16
  3331. color) display that can be restored using EGARest9 (see).
  3332.  
  3333. Two arrays must be used to hold the screen, for a total of
  3334. 112,000 bytes. If you use integer arrays, each array must be
  3335. created by DIM Array%(1 TO 28000).
  3336.  
  3337.    EGASave9 DSeg%, DOfs%
  3338.  
  3339. DSeg1%       segment of storage array #1, returned by VARSEG
  3340. DOfs1%       offset  of storage array #1, returned by VARPTR
  3341. DSeg2%       segment of storage array #2, returned by VARSEG
  3342. DOfs2%       offset  of storage array #2, returned by VARPTR
  3343.  
  3344. Name  : Elapsed              (Elapsed time)
  3345. Class : Time
  3346. Level : Any
  3347.  
  3348. This routine tells you the amount of time elapsed between a
  3349. given starting time and ending time. The difference between the
  3350. times must be less than 24 hours for the results to be
  3351. meaningful.
  3352.  
  3353. See also ElapsedTime, the FUNCTION version of this routine.
  3354.  
  3355.    Elapsed TimeStart$, TimeStop$, TimeDiff$
  3356.  
  3357. TimeStart$   starting time
  3358. TimeStop$    ending time
  3359. -------
  3360. TimeDiff$    elapsed time
  3361.  
  3362. Name  : ElapsedTime$         (Elapsed time)
  3363. Class : Time
  3364. Level : Any
  3365.  
  3366. This routine tells you the amount of time elapsed between a
  3367. given starting time and ending time. The difference between the
  3368. times must be less than 24 hours for the results to be
  3369. meaningful.
  3370.  
  3371. See also Elapsed, the SUB version of this routine.
  3372.  
  3373.    TimeDiff$ = ElapsedTime$(TimeStart$, TimeStop$)
  3374.  
  3375. TimeStart$   starting time
  3376. TimeStop$    ending time
  3377. -------
  3378. TimeDiff$    elapsed time
  3379.  
  3380. Name  : EMSBuffer            (EMS Buffer size)
  3381. Class : Memory
  3382. Level : BIOS
  3383.  
  3384. EMSBuffer tells you how many bytes are needed to save the state
  3385. of the EMS array routines. Used in conjunction with EMSSave and
  3386. EMSRest, it allows you to preserve EMS arrays across a CHAIN to
  3387. another part of your program.
  3388.  
  3389.    EMSBuffer Bytes%
  3390.    EMSState$ = SPACE$(Bytes%)
  3391.    EMSSave EMSState$
  3392.  
  3393. -------
  3394. Bytes%       bytes needed to save EMS array state
  3395.  
  3396. Name  : EMSClose             (EMS Close)
  3397. Class : Memory
  3398. Level : BIOS
  3399.  
  3400. The EMSClose routine is used when you are finished with an EMS
  3401. array. It frees the array handle and EMS memory for other uses.
  3402. If you don't close all EMS arrays before your program ends, the
  3403. memory will be lost until the system is rebooted, so it is
  3404. important to remember EMSClose.
  3405.  
  3406.    EMSClose ArrayHandle%
  3407.  
  3408. ArrayHandle%    handle of an EMS array
  3409.  
  3410. Name  : EMSGet               (EMS Get)
  3411. Class : Memory
  3412. Level : BIOS
  3413.  
  3414. This routine gets an element from an EMS array created by
  3415. EMSOpen. Element numbers start at 0. Be sure to use the right
  3416. numeric type for the array-- for instance, if you opened the
  3417. array for SINGLE precision, use "Value!".
  3418.  
  3419.    EMSGet ArrayHandle%, ElementNr&, Value
  3420.  
  3421. ArrayHandle%    handle of an EMS array
  3422. ElementNr&      element number to get
  3423. -------
  3424. Value           result (must be correct type for array)
  3425.  
  3426. Name  : EMSOpen              (EMS Open)
  3427. Class : Memory
  3428. Level : BIOS
  3429.  
  3430. This routine allows you to open a block of EMS (expanded) memory
  3431. which can then be accessed like a numeric array. The array size
  3432. is limited only by available EMS memory (use GetLIMM to find out
  3433. how much is available). You may specify any numeric type:
  3434.  
  3435.     1   INTEGER
  3436.     2   LONG or SINGLE
  3437.     3   DOUBLE
  3438.  
  3439. When the array is opened, you are returned an "array handle"
  3440. which is used to access that array. Access to the array is done
  3441. via EMSGet and EMSPut. When you are finished with the array, you
  3442. must close it with EMSClose.
  3443.  
  3444. As many as 25 EMS arrays can be in use at one time, subject to
  3445. limitations which may be imposed by your EMS driver (each array
  3446. requires one EMS handle).
  3447.  
  3448.    EMSOpen Elements&, ElementType%, ArrayHandle%, ErrCode%
  3449.  
  3450. Elements&       number of elements in array (like DIM size)
  3451. ElementType%    numeric type of array (see above)
  3452. -------
  3453. ArrayHandle%    handle of an EMS array
  3454. ErrCode%        whether an error occurred (0 no)
  3455.  
  3456. Name  : EMSPut               (EMS Put)
  3457. Class : Memory
  3458. Level : BIOS
  3459.  
  3460. This routine puts an element into an EMS array created by
  3461. EMSOpen. Element numbers start at 0. Be sure to use the right
  3462. numeric type for the array-- for instance, if you opened the
  3463. array for SINGLE precision, use "Value!".
  3464.  
  3465.    EMSPut ArrayHandle%, ElementNr&, Value
  3466.  
  3467. ArrayHandle%    handle of an EMS array
  3468. ElementNr&      element number to set
  3469. Value           value to store (must be correct type for array)
  3470.  
  3471. Name  : EMSRest              (EMS Restore state)
  3472. Class : Memory
  3473. Level : BIOS
  3474.  
  3475. This routine allows you to restore the state of the EMS array
  3476. handler. Used in conjunction with EMSBuffer and EMSSave, it
  3477. allows you to preserve EMS arrays across a CHAIN to another part
  3478. of your program.
  3479.  
  3480.    EMSRest EMSState$
  3481.  
  3482. EMSState$    saved EMS array state
  3483.  
  3484. Name  : EMSSave              (EMS Save state)
  3485. Class : Memory
  3486. Level : BIOS
  3487.  
  3488. This routine allows you to save the state of the EMS array
  3489. handler. Used in conjunction with EMSBuffer and EMSRest, it
  3490. allows you to preserve EMS arrays across a CHAIN to another part
  3491. of your program.
  3492.  
  3493.    EMSBuffer Bytes%
  3494.    EMSState$ = SPACE$(Bytes%)
  3495.    EMSSave EMSState$
  3496.  
  3497. -------
  3498. EMSState$    saved EMS array state
  3499.  
  3500. Name  : EnhKbd               (Enhanced Keyboard)
  3501. Class : Input
  3502. Level : BIOS
  3503.  
  3504. By default, the PBClone routines assume an old-style keyboard is
  3505. in use, for greatest compatibility. EnhKbd allows you to turn on
  3506. enhanced keyboard handling for the current generation of
  3507. (usually) 101-key keyboards. This allows access to the F11 and
  3508. F12 function keys as well as codes for key combinations that
  3509. used to be ignored, among other things.
  3510.  
  3511. The KbdType or KbdType2% routine can be used to determine if an
  3512. enhanced keyboard is available (recommended).
  3513.  
  3514. Note that EnhKbd works by intercepting the BIOS keyboard
  3515. handler. All calls to the BIOS keyboard interrupt are converted
  3516. from the old keyboard functions to the new ones. YOU MUST
  3517. DISABLE EnhKbd BEFORE YOUR PROGRAM ENDS, so it can restore the
  3518. old setup. Otherwise, the computer will most probably crash.
  3519.  
  3520. A list of the new key codes is given in PBClone.DOC.
  3521.  
  3522.    EnhKbd Enable%
  3523.  
  3524. Enable%     turn on enhanced keyboard support (0 disable)
  3525.  
  3526. Name  : Equipment            (Equipment information)
  3527. Class : Equipment
  3528. Level : BIOS
  3529.  
  3530. This routine gives you some information about the basic
  3531. equipment in your computer. Note that the "game port"
  3532. information is not reliable, due to changes in the meaning of
  3533. this particular area of the BIOS over many years.
  3534.  
  3535.    Equipment Memory%, Parallel%, Serial%, Game%
  3536.  
  3537. -------
  3538. Memory%    kilobytes of conventional memory installed (16 - 640)
  3539. Parallel%  parallel (printer) ports installed (0-4)
  3540. Serial%    serial (communications) ports installed (0-4)
  3541. Game%      game (joystick) ports installed (0-1).  See remarks, above.
  3542.  
  3543. Name  : EuropeDate           (European Date format)
  3544. Class : Time
  3545. Level : Any
  3546.  
  3547. This routine takes a date in one of the American formats
  3548. ("MM/DD/YY" or "MM-DD-YYYY") and converts it to the European
  3549. convention ("DD.MM.YY" or "DD.MM.YYYY"). The date is formatted
  3550. according to a format string which provides the desired
  3551. delimiter and year length, e.g. "##-##-##" specifies a delimiter
  3552. of "-" and a year length of two digits.
  3553.  
  3554. An error code is returned if the date is not valid.
  3555.  
  3556.    EuropeDate DateSt$, Format$, Result$, ErrCode%
  3557.  
  3558. DateSt$     date to format (month, day, year order)
  3559. Format$     format for the date
  3560. -------
  3561. Result$     resulting date (day, month, year order)
  3562. ErrCode     whether the date is valid (0 ok)
  3563.  
  3564. Name  : EWindowManagerC      (EGA Window Manager w Char coords)
  3565. Class : Display
  3566. Level : Clone
  3567.  
  3568. EWindowManagerC displays a pop-up window according to your
  3569. specifications. The window may have any of a variety of frames,
  3570. a title, or a shadow, and it may appear instantly or "grow" onto
  3571. the screen. EGA and VGA graphics modes (SCREEN 7 through SCREEN
  3572. 12) are supported.
  3573.  
  3574. These are the available frame types:
  3575.     0   no frame
  3576.     1   single lines
  3577.     2   double lines
  3578.     3   single horizontal, double vertical lines
  3579.     4   double horizontal, single vertical lines
  3580.     5   block graphic lines
  3581.  
  3582. These are the available shadows:
  3583.     0   no shadow
  3584.    1+   shadow attribute (use CalcAttr) for a colored shadow
  3585.  
  3586. Options for growing windows are as follows:
  3587.    -1   grow as fast as possible
  3588.     0   pop onto the screen
  3589.    1+   grow with delay given in milliseconds (not recommended)
  3590.  
  3591. The differences between this routine and its ProBas equivalent
  3592. are the same as mentioned in the description for WindowManager.
  3593. Also, growing windows are supported, but are not recommended
  3594. (too slow). Colored shadows work as in WindowManager. "True"
  3595. shadows are not yet supported.
  3596.  
  3597.    EWindowManagerC TRow%, LCol%, BRow%, RCol%, Frame%,
  3598.       Fore%, Back%, Grow%, Shade%, S1%, S2%, TFore%, Title$
  3599.  
  3600. TRow%       top row of window
  3601. LCol%       left column of window
  3602. BRow%       bottom row of window
  3603. RCol%       right column of window
  3604. Frame%      frame type (see above)
  3605. Fore%       frame foreground color
  3606. Back%       frame background color
  3607. Grow%       window growing option (see above)
  3608. Shade%      window shadow option (see above)
  3609. S1%         unused
  3610. S2%         unused
  3611. TFore%      title foreground color
  3612. Title$      window title ("" if none)
  3613.  
  3614. Name  : Exist                (file Existence)
  3615. Class : Disk
  3616. Level : DOS
  3617.  
  3618. Most versions of BASIC give you no way of seeing if a file
  3619. exists before you try to OPEN it, so you end up taking your
  3620. chances. The Exist routine allows you to test to see if the file
  3621. exists beforehand. It isn't really necessary for the PBClone
  3622. file routines, which will return an appropriate error code, but
  3623. it's an important safeguard when using the BASIC OPEN statement.
  3624.  
  3625. The Exist routine does not support wildcards. If you need that
  3626. feature, try the FindFirstFx and FindNextFx routines instead.
  3627.  
  3628. See also Exist2, the FUNCTION version of this routine.
  3629.  
  3630.    Exist FileName$, Found%
  3631.  
  3632. FileName$   name of the file to look for
  3633. -------
  3634. Found%      whether the file was found (0 if no)
  3635.  
  3636. Name  : Exist2%              (file Existence)
  3637. Class : Disk
  3638. Level : DOS
  3639.  
  3640. Most versions of BASIC give you no way of seeing if a file
  3641. exists before you try to OPEN it, so you end up taking your
  3642. chances. The Exist2% function allows you to test to see if the
  3643. file exists beforehand. It isn't really necessary for the
  3644. PBClone file routines, which will return an appropriate error
  3645. code, but it's an important safeguard when using the OPEN
  3646. statement.
  3647.  
  3648. The Exist2% routine does not support wildcards. If you need that
  3649. feature, try the FindFirstFx and FindNextFx routines instead.
  3650.  
  3651. See also Exist, the SUB version of this routine.
  3652.  
  3653.    Found% = Exist2%(FileName$)
  3654.  
  3655. FileName$   name of the file to look for
  3656. -------
  3657. Found%      whether the file was found (0 if no)
  3658.  
  3659. Name  : ExplainFAttr$        (Explain File Attribute)
  3660. Class : Disk
  3661. Level : Any
  3662.  
  3663. This function returns a string explaining what a file attribute
  3664. means, using a specified level of abbreviation. A single space
  3665. is used between each word, e.g. a hidden subdirectory at
  3666. abbreviation level 2 would be "Hid Dir".
  3667.  
  3668. Abbreviation Levels:
  3669.         1           2              3
  3670.    ---------------------------------------
  3671.  1      R          R-O         Read-Only
  3672.  2      H          Hid         Hidden
  3673.  4      S          Sys         System
  3674.  8      V          Vol         Volume
  3675. 16      D          Dir         Directory
  3676. 32      A          Arc         Archive
  3677.  
  3678. This function is convenient in conjunction with any of the
  3679. routines which return a file attribute: GetAttrF, GetAttrFx,
  3680. GetFAttr, LoadDirAll.
  3681.  
  3682.    Info$ = ExplainFAttr$(FilAttr%, AbbrevLevel%)
  3683.  
  3684. We use FilAttr% instead of FileAttr%, since BASIC has a built-in
  3685. FILEATTR function.
  3686.  
  3687. FilAttr%      file attribute
  3688. -------
  3689. AbbrevLevel%  how much to abbreviate the result (1-3)
  3690.  
  3691. Name  : EXQPrintC            (EGA Extended Quick Print, Char)
  3692. Class : Display
  3693. Level : Clone
  3694.  
  3695. This routine provides a rather crude, but very fast, display
  3696. capability. It works like the PRINT statement in BASIC, except
  3697. that it doesn't move the cursor or process control codes. It
  3698. works in EGA and VGA graphics modes (SCREEN 7 through SCREEN
  3699. 12).
  3700.  
  3701. The results of this routine are not redirectable by DOS.
  3702.  
  3703.    EXQPrintC St$, Row%, Column%, Fore%, Back%
  3704.  
  3705. St$       string to display
  3706. Row%      starting row
  3707. Column%   starting column
  3708. Fore%     foreground color
  3709. Back%     background color
  3710.  
  3711. Name  : ExtendFSpec          (Extend File Specification)
  3712. Class : Disk
  3713. Level : DOS
  3714.  
  3715. The ExtendFSpec routine combines a number of handy services
  3716. together. It is intended for processing user-entered file
  3717. specifications. It does the following:
  3718.  
  3719.    1) Makes sure the filespec is valid
  3720.    2) Formats the filespec to normal DOS standards
  3721.    3) Tells you whether the drive and subdirectories
  3722.       specified exist
  3723.    4) Fills out any drive or subdirectory information that
  3724.       was left out (optionally includes adding an extension
  3725.       to files which lack one)
  3726.  
  3727. The error codes returned are as follows:
  3728.    -1    Invalid file specification
  3729.     0    No error
  3730.     1    Specified drive does not exist (warning only)
  3731.     2    Specified subdirectory does not exist (warning only)
  3732.  
  3733. The ExtendFSpec routine mimics DOS filename handling exactly, to
  3734. the best of my knowledge.
  3735.  
  3736.    ExtendFSpec File$, Ext$, FullFile$, ErrCode%
  3737.  
  3738. File$      file specification to process
  3739. Ext$       extension to add to files that don't have extensions
  3740. -------
  3741. FullFile$  processed file specification
  3742. ErrCode%   error code
  3743.  
  3744. Name  : ExtGet               (Extended memory Get)
  3745. Class : Memory
  3746. Level : BIOS (AT)
  3747.  
  3748. This routine allows you to get information from extended memory.
  3749. It should only be used on AT-class computers, since older PCs do
  3750. not support extended memory.
  3751.  
  3752. You may get up to 32,766 words (just under 64 kilobytes) at a
  3753. time from a specified location in extended memory. The location
  3754. is specified as the distance from the start of extended memory,
  3755. starting at 1 for the first location. One word is equivalent to
  3756. one integer.
  3757.  
  3758. See ExtMem for information on extended memory constraints.
  3759.  
  3760.    ExtGet DSeg%, DOfs%, Posn&, Words%, ErrCode%
  3761.  
  3762. DSeg%       segment of array to place data from extended memory
  3763. DOfs%       offset of array to place data from extended memory
  3764. Posn&       location of data in extended memory (starting at 1)
  3765. Words%      # of words to transfer (1 int = 1 word = 2 byte)
  3766. -------
  3767. ErrCode%    error code (0 if no error)
  3768.  
  3769. Name  : ExtMem               (Extended Memory)
  3770. Class : Memory / Equipment
  3771. Level : BIOS (AT)
  3772.  
  3773. This routine allows you to find out how much extended memory is
  3774. available. It should only be used on AT-class computers, since
  3775. older PCs do not support extended memory.
  3776.  
  3777. The amount of memory returned may be either the total amount of
  3778. extended memory installed or just the amount available at this
  3779. time, depending on how previously-installed programs (if any)
  3780. make use of extended memory. Unfortunately, there is no standard
  3781. which defines how a program should use extended memory as there
  3782. is with EMS (expanded memory), so there is no way for a program
  3783. to determine whether or how another program is using extended
  3784. memory. Microsoft is trying to clear up this situation with its
  3785. HIMEM driver (available at your local BBS, or [last I looked]
  3786. free from Microsoft), but this approach hasn't really become
  3787. standard yet.
  3788.  
  3789.    ExtMem KBytes%
  3790.  
  3791. -------
  3792. KBytes%     the number of kilobytes of extended memory
  3793.  
  3794. Name  : ExtPut               (Extended memory Put)
  3795. Class : Memory
  3796. Level : BIOS (AT)
  3797.  
  3798. This routine allows you to put information into extended memory.
  3799. It should only be used on AT-class computers, since older PCs do
  3800. not support extended memory.
  3801.  
  3802. You may put up to 32,766 words (just under 64 kilobytes) at a
  3803. time into a specified location in extended memory. The location
  3804. is specified as the distance from the start of extended memory,
  3805. starting at 1 for the first location. One word is equivalent to
  3806. one integer.
  3807.  
  3808. Note that you can't rely on extended memory being available just
  3809. because it exists. There is no automatic way to determine if
  3810. another program is also trying to use the same extended memory.
  3811. If in doubt, allow a user-installed option to enable/disable the
  3812. use of extended memory by your program.
  3813.  
  3814.    ExtPut DSeg%, DOfs%, Posn&, Words%, ErrCode%
  3815.  
  3816. DSeg%       segment of data to store in extended memory
  3817. DOfs%       offset of data to store in extended memory
  3818. Posn&       location to place data in extended memory
  3819. Words%      # of words to transfer (1 int = 1 word = 2 bytes)
  3820. -------
  3821. ErrCode%    error code (0 if no error)
  3822.  
  3823. Name  : Extract              (Extract delimited substring)
  3824. Class : String
  3825. Level : Any
  3826.  
  3827. Extract allows you to remove any one of a list of delimited
  3828. substrings in a string. It's useful for input parsing and
  3829. database work. You pass it the string, delimiter, and the number
  3830. of the desired substring (numbers start at one). It returns the
  3831. starting position of the substring within the string and the
  3832. length of the substring (0 if not found).
  3833.  
  3834. Just for example, let's assume we have a string as follows:
  3835.    St$ = "Charon Software=260 So. Woodruff=Idaho Falls, ID  83401"
  3836.  
  3837. If we selected a delimiter of "=" and substring number three,
  3838. the results would be "Mesa, AZ 85204".
  3839.  
  3840. Delimiters of more than one character are fine. This can be
  3841. handy for locating carriage return/linefeed pairs, among other
  3842. things.
  3843.  
  3844.    Extract St$, Delimiter$, SubStrNr%, StartPosn%, SLen%
  3845.    SubSt$ = MID$(St$, StartPosn%, SLen%)
  3846.  
  3847. St$         string from which to extract
  3848. Delimiter$  delimiter between substrings
  3849. SubStrNr%   number of the desired substring
  3850. -------
  3851. StartPosn%  starting position of substring within the string
  3852. SLen%       length of the substring (0 if none)
  3853.  
  3854. Name  : FadeOut              (Fade Out)
  3855. Class : Display
  3856. Level : Clone
  3857.  
  3858. Like CLS, but a bit more fancy, this routine provides an
  3859. interesting way to clear the screen. See also Dissolve.
  3860.  
  3861.    FadeOut VAttr%
  3862.  
  3863. VAttr%   color/attribute to which to clear (see CalcAttr)
  3864.  
  3865. Name  : FarPeek%             (Far memory Peek)
  3866. Class : Memory
  3867. Level : Clone
  3868.  
  3869. This is like the BASIC PEEK function, but expects both a segment
  3870. and an offset, thus doing away with the need for DEF SEG. This
  3871. is especially handy for use in subprograms which might otherwise
  3872. inadvertently change the DEF SEG value expected by the main
  3873. program.
  3874.  
  3875.    Value% = FarPeek%(DSeg%, DOfs%)
  3876.  
  3877. Related routines include FarPeekI%, FarPeekL&, DGetSt, DGetRec.
  3878.  
  3879. DSeg%    segment of the location to look at
  3880. DOfs%    offset of the location to look at
  3881. -------
  3882. Value%   value at the specified memory location (byte: 0-255)
  3883.  
  3884. Name  : FarPeekI%            (Far memory Peek Integer)
  3885. Class : Memory
  3886. Level : Clone
  3887.  
  3888. This is like the BASIC PEEK function, but expects both a segment
  3889. and an offset, thus doing away with the need for DEF SEG. This
  3890. is especially handy for use in subprograms which might otherwise
  3891. inadvertently change the DEF SEG value expected by the main
  3892. program. Unlike PEEK, this routine returns a word (integer)
  3893. rather than a byte.
  3894.  
  3895.    Value% = FarPeekI%(DSeg%, DOfs%)
  3896.  
  3897. Related routines include FarPeek%, FarPeekL&, DGetSt, DGetRec.
  3898.  
  3899. DSeg%    segment of the location to look at
  3900. DOfs%    offset of the location to look at
  3901. -------
  3902. Value%   value at the specified memory location (word)
  3903.  
  3904. Name  : FarPeekL&            (Far memory Peek Long integer)
  3905. Class : Memory
  3906. Level : Clone
  3907.  
  3908. This is like the BASIC PEEK function, but expects both a segment
  3909. and an offset, thus doing away with the need for DEF SEG. This
  3910. is especially handy for use in subprograms which might otherwise
  3911. inadvertently change the DEF SEG value expected by the main
  3912. program. Unlike PEEK, this routine returns a dword (long
  3913. integer) rather than a byte.
  3914.  
  3915.    Value& = FarPeekL&(DSeg%, DOfs%)
  3916.  
  3917. Related routines include FarPeek%, FarPeekI%, DGetSt, DGetRec.
  3918.  
  3919. DSeg%    segment of the location to look at
  3920. DOfs%    offset of the location to look at
  3921. -------
  3922. Value&   value at the specified memory location (dword)
  3923.  
  3924. Name  : FarPoke              (Far memory Poke)
  3925. Class : Memory
  3926. Level : Clone
  3927.  
  3928. This is like the BASIC POKE statement, but expects both a
  3929. segment and an offset, thus doing away with the need for DEF
  3930. SEG. This is especially handy for use in subprograms which might
  3931. otherwise inadvertently change the DEF SEG value expected by the
  3932. main program.
  3933.  
  3934.    FarPoke DSeg%, DOfs%, Value%
  3935.  
  3936. Related routines include FarPokeI, FarPokeL, DPutSt, DPutRec.
  3937.  
  3938. DSeg%    segment of the location to look at
  3939. DOfs%    offset of the location to look at
  3940. Value%   value to store in the given memory posn (byte: 0-255)
  3941.  
  3942. Name  : FarPokeI             (Far memory Poke Integer)
  3943. Class : Memory
  3944. Level : Clone
  3945.  
  3946. This is like the BASIC POKE statement, but expects both a
  3947. segment and an offset, thus doing away with the need for DEF
  3948. SEG. This is especially handy for use in subprograms which might
  3949. otherwise inadvertently change the DEF SEG value expected by the
  3950. main program. Unlike POKE, this routine stores a word or
  3951. integer.
  3952.  
  3953.    FarPokeI DSeg%, DOfs%, Value%
  3954.  
  3955. Related routines include FarPoke, FarPokeL, DPutSt, DPutRec.
  3956.  
  3957. DSeg%    segment of the location to look at
  3958. DOfs%    offset of the location to look at
  3959. Value%   value to store in the given memory posn (word)
  3960.  
  3961. Name  : FarPokeL             (Far memory Poke Long integer)
  3962. Class : Memory
  3963. Level : Clone
  3964.  
  3965. This is like the BASIC POKE statement, but expects both a
  3966. segment and an offset, thus doing away with the need for DEF
  3967. SEG. This is especially handy for use in subprograms which might
  3968. otherwise inadvertently change the DEF SEG value expected by the
  3969. main program. Unlike POKE, this routine stores a dword or long
  3970. integer.
  3971.  
  3972.    FarPokeL DSeg%, DOfs%, Value&
  3973.  
  3974. Related routines include FarPoke, FarPokeI, DPutSt, DPutRec.
  3975.  
  3976. DSeg%    segment of the location to look at
  3977. DOfs%    offset of the location to look at
  3978. Value&   value to store in the given memory posn (dword)
  3979.  
  3980. Name  : FClose1              (File Close)
  3981. Class : Disk
  3982. Level : DOS
  3983.  
  3984. This routine closes a file that was opened by FOpen1 or FCreate.
  3985. It can also be used to close any of the predefined device
  3986. handles.
  3987.  
  3988. These are the predefined device handles that are always
  3989. available:
  3990.  
  3991.    0    CON     stdin     standard input, normally the keyboard
  3992.    1    CON     stdout    standard output, normally the display
  3993.    2    CON     stderr    standard error, almost always display
  3994.    3    AUX     stdaux    auxiliary device, generally COM1
  3995.    4    PRN     stdprn    standard printer, generally LPT1
  3996.  
  3997. If you are running short of handles, you can always close stdaux
  3998. to free up a handle. The stdprn device can also be closed as
  3999. long as you don't use the printer or if you only access the
  4000. printer through LPRINT. It is not a good idea to close stdin,
  4001. stdout, or stderr under normal circumstances.
  4002.  
  4003.    FClose1 Handle%
  4004.  
  4005. Handle%    handle of the file to close
  4006.  
  4007. Name  : FCreate              (File Create)
  4008. Class : Disk
  4009. Level : DOS
  4010.  
  4011. This routine creates a file and opens it for use by the PBClone
  4012. file handling routines. If the file already existed, it will be
  4013. wiped out, so you may want to check beforehand if this is a
  4014. problem. Try the Exist routine.
  4015.  
  4016. The file is opened in read/write mode, allowing both input and
  4017. output.
  4018.  
  4019. You may create the file using any of the following attributes:
  4020.  
  4021.    Normal          0      (nothing special)
  4022.    Read Only       1      file can be read, but not written to
  4023.    Hidden          2      file is "invisible"
  4024.    System          4      special DOS system file
  4025.  
  4026. The attributes can be combined by adding them together. Don't
  4027. use the System attribute unless you know what you're doing!
  4028.  
  4029. Note that this routine does not support file sharing. If that is
  4030. a problem, close the file just after it is created and reopen it
  4031. using FOpen1.
  4032.  
  4033.    FCreate FileName$, FAttr%, Handle%, ErrCode%
  4034.  
  4035. FileName$  name of the file to create
  4036. FAttr%     attribute(s) of the file
  4037. -------
  4038. Handle%    handle by which to access the file (if no error)
  4039. ErrCode%   error code: 0 if no error, else DOS Error
  4040.  
  4041. Name  : FDescRead$           (File Description Read)
  4042. Class : Disk
  4043. Level : DOS
  4044.  
  4045. This routine reads a 4DOS-style file description from disk. If
  4046. there is no description or an error occurs, the result will be a
  4047. null string.
  4048.  
  4049.    FileDesc$ = FDescRead$(FileName$)
  4050.  
  4051. FileName$   file name
  4052. -------
  4053. FileDesc$   description of file, if any
  4054.  
  4055. Name  : FGetLoc              (File Get Location)
  4056. Class : Disk
  4057. Level : DOS
  4058.  
  4059. This routine tells you the position of the file pointer of a
  4060. file that was opened using FOpen1 or FCreate. This pointer is
  4061. used to specify where the next item should be read from or
  4062. written to the file. The first location of the file is at 1.
  4063.  
  4064. See also FGetLoc2, the FUNCTION version of this routine.
  4065.  
  4066.    FGetLoc Handle%, Posn&
  4067.  
  4068. Handle%    handle of the file
  4069. -------
  4070. Posn&      location of the file pointer
  4071.  
  4072. Name  : FGetLoc2&            (File Get Location)
  4073. Class : Disk
  4074. Level : DOS
  4075.  
  4076. This routine tells you the position of the file pointer of a
  4077. file that was opened using FOpen1 or FCreate. This pointer is
  4078. used to specify where the next item should be read from or
  4079. written to the file. The first location of the file is at 1.
  4080.  
  4081. See also FGetLoc, the SUB version of this routine.
  4082.  
  4083.    Posn& = FGetLoc2&(Handle%)
  4084.  
  4085. Handle%    handle of the file
  4086. -------
  4087. Posn&      location of the file pointer
  4088.  
  4089. Name  : FileCopy             (File Copy)
  4090. Class : Disk
  4091. Level : DOS
  4092.  
  4093. This routine copies one or more files, just like the DOS command
  4094. "COPY".
  4095.  
  4096. FileCopy works exactly like the DOS COPY command, except it
  4097. won't append files. You may use wildcards in both source and
  4098. destination file specifications. In the event of an error,
  4099. normal DOS error codes are returned, with two exceptions:
  4100.  
  4101.   -2  attempt to copy files over themselves
  4102.   -1  attempt to copy multiple sources to a single dest file
  4103.  
  4104. See also CopyFile, a simpler routine which doesn't support
  4105. wildcards.
  4106.  
  4107.    FileCopy SrcFile$, DestFile$, FCount%, ByteCount&, ErrCode%
  4108.  
  4109. SrcFile$    source file name(s)
  4110. DestFile$   destination file name(s)
  4111. -------
  4112. FCount%     number of files copied
  4113. ByteCount&  number of bytes copied
  4114. ErrCode%    error code (0 if no error)
  4115.  
  4116. Name  : FileCount            (File Count)
  4117. Class : Disk
  4118. Level : DOS
  4119.  
  4120. This routine returns the number of files which match a given
  4121. file specification and attribute. You need to use this routine
  4122. before LoadDir or LoadDirAll in order to DIM the array to the
  4123. appropriate size.
  4124.  
  4125. The attribute can be any of the usual file attributes:
  4126.    1   Read-Only
  4127.    2   Hidden
  4128.    4   System
  4129.   16   Directory
  4130.  
  4131. You can combine attributes by adding their values. For instance,
  4132. to search for hidden directories, you'd use an attribute of 18.
  4133. By default, DOS returns normal files as well as files which have
  4134. the specified attributes, so an attribute of 18 would get you
  4135. normal files, hidden files, directories, and hidden directories.
  4136. However, FileCount can be made to screen out unwanted files--
  4137. just negate the attribute to force only files of that attribute
  4138. to be counted. For example, an attribute of -18 would return
  4139. only hidden subdirectories.
  4140.  
  4141.    FileCount FileSpec$, FilAttr%, Count%, ErrCode%
  4142.  
  4143. We use FilAttr% instead of FileAttr%, since BASIC has a built-in
  4144. FILEATTR function.
  4145.  
  4146. FileSpec$   search filename (may contain wildcards)
  4147. FilAttr%    search file attribute
  4148. -------
  4149. Count%      number of matching files found
  4150. ErrCode%    error code (0 if no error)
  4151.  
  4152. Name  : FileCRC              (File CRC)
  4153. Class : Disk
  4154. Level : DOS
  4155.  
  4156. This routine calculates a 32-bit CRC for a file. This CRC is
  4157. derived by a formula which takes each character of the file into
  4158. consideration. It provides a powerful (although not 100%
  4159. foolproof) way to verify that a file hasn't changed since you
  4160. last checked.
  4161.  
  4162.    FileCRC FileName$, Result&, ErrCode%
  4163.  
  4164. FileName$   source file name(s)
  4165. -------
  4166. Result&     32-bit CRC of the file
  4167. ErrCode%    error code (0 if no error)
  4168.  
  4169. Name  : FileMenu             (File Menu)
  4170. Class : Input
  4171. Level : Clone
  4172.  
  4173. This routine provides a list of files according to the filespec
  4174. and attribute you pass it and allows the user to pick a single
  4175. file from the resulting list. The filespec may contain a full
  4176. path and wildcards. The attribute may be negated if you insist
  4177. on an exact match (directories only, for example), or use a
  4178. normal attribute for multiple matches (directories and files,
  4179. for instance). Many of the usual WindowManager parameters are
  4180. used here-- top row, left column, and bottom row (right column
  4181. is calculated for you), window frame color and frame type,
  4182. growth, shadow, title string and title color-- see the
  4183. WindowManager routine for details. For a description of file
  4184. search attributes, see the FindFirstFx routine.
  4185.  
  4186. If you allow using the mouse, be sure the mouse is initialized
  4187. (MMCheck or MMCheck2%) and the mouse cursor is visible
  4188. (MMCursorOn) before calling this routine.
  4189.  
  4190. This routine automatically saves and restores the underlying
  4191. screen. It can handle up to 2,048 files in a window. See
  4192. CalcAttr if you're not familiar with color/attributes.
  4193.  
  4194.    FileMenu Mouse%, FileSpec$, SeekAttr%, TopRow%, LeftCol%, _
  4195.       BottomRow%, Frame%, FrameAttr%, FileListAttr%, _
  4196.       HiliteAttr%, TitleFore%, Title$, Grow%, Shade%
  4197.  
  4198. Mouse%          whether to support the mouse (0 no, -1 yes)
  4199. FileSpec$       filespec to use in creating the file list
  4200. SeekAttr%       file search attribute to use in creating list
  4201. TopRow%         top row of pick window
  4202. LeftCol%        left column of pick window
  4203. BottomRow%      bottom row of pick window
  4204. Frame%          frame type
  4205. FrameAttr%      frame color/attribute
  4206. FileListAttr%   file list color/attribute
  4207. HiliteAttr%     highlight bar color/attribute
  4208. TitleFore%      title foreground color (backgnd is frame color)
  4209. Title$          title (use "" for no title)
  4210. Grow%           window growth
  4211. Shade%          window shadow
  4212. -------
  4213. FileSpec$       file picked ("" if none)
  4214.  
  4215. Name  : FindFirstA           (Find First file in an Archive)
  4216. Class : Disk
  4217. Level : DOS
  4218.  
  4219. The FindFirstA routine is used to find the first file that
  4220. matches search parameters which you specify. Various information
  4221. about the file that matches (if any) can be retrieved by other
  4222. routines.
  4223.  
  4224. Rather than working on a directory, this routine works on files
  4225. in an archive. Supported archive formats include ARC, ARJ, LZH,
  4226. PAK, ZIP and ZOO. Self-extracting archives in ARJ, LHARC, and
  4227. PKZIP (ZIP2EXE) form are also supported, as either .COM or .EXE
  4228. files. If no extension is given, a search will be made through
  4229. each valid archive extension, and the first matching archive
  4230. will be used for the file search.
  4231.  
  4232. Archive names may contain drive and subdirectory specs, but not
  4233. wildcards. File names may contain wildcards, but not drive or
  4234. subdir specs.
  4235.  
  4236. When you are done searching, be sure to use CloseA to terminate
  4237. the search.
  4238.  
  4239. Routines in this series include:
  4240.    FindFirstA, FindNextA, GetNameA, GetCRCA, GetCRCAL,
  4241.    GetDateA, GetTimeA, GetSizeAL, GetStoreA
  4242.  
  4243.    FindFirstA ArcName$, FileName$, ErrCode%
  4244.  
  4245. ArcName$    name of archive to search through
  4246. FileName$   name of file(s) for which to search
  4247. -------
  4248. ErrCode%    error code (0 if no error, else no matching files)
  4249.  
  4250. Name  : FindFirstF           (Find First File)
  4251. Class : Disk
  4252. Level : DOS
  4253.  
  4254. This is part of a set of routines included for compatibility
  4255. with ADVBAS and ProBas. A better solution may be found in
  4256. FindFirstFx.
  4257.  
  4258. The FindFirstF routine is used to find the first file that
  4259. matches search parameters which you specify. Various information
  4260. about the file that matches (if any) can be retrieved by other
  4261. routines. See also FindNextF.
  4262.  
  4263. The file name specified may contain a drive and subdirectory
  4264. specification. Wildcards are also allowed.
  4265.  
  4266. Possible search attributes are as follows:
  4267.  
  4268.    Normal          0      (nothing special)
  4269.    Hidden          2      file is "invisible"
  4270.    System          4      special DOS system file
  4271.    Subdirectory   16      subdirectory
  4272.  
  4273. You can combine the attributes by adding them together. All
  4274. searches will match if any of the specified attributes are
  4275. found, so if you're looking only for a specific attribute, you
  4276. will need to test the results using GetAttrF.
  4277.  
  4278. Routines in this series include:
  4279.    FindFirstF, FindNextF, GetNameF, GetAttrF, GetDateF,
  4280.    GetTimeF, GetSizeFL
  4281.  
  4282.    FindFirstF FileName$, FAttr%, ErrCode%
  4283.  
  4284. FileName$   name of file(s) for which to search
  4285. FAttr%      file attribute(s) to seek
  4286. -------
  4287. ErrCode%    error code (0 if no error, else no matching files)
  4288.  
  4289. Name  : FindFirstFx          (Find First File, Extended)
  4290. Class : Disk
  4291. Level : DOS
  4292.  
  4293. The FindFirstFx routine is used to find the first file that
  4294. matches search parameters which you specify. Various information
  4295. about the file that matches (if any) can be retrieved by other
  4296. routines.
  4297.  
  4298. The file name specified may contain a drive and subdirectory
  4299. specification. Wildcards are also allowed.
  4300.  
  4301. Possible search attributes are as follows:
  4302.  
  4303.    Normal          0      (nothing special)
  4304.    Read Only       1      file can be read, but not written to
  4305.    Hidden          2      file is "invisible"
  4306.    System          4      special DOS system file
  4307.    Subdirectory   16      subdirectory
  4308.  
  4309. You can combine the attributes by adding them together. All
  4310. searches will match if any of the specified attributes are
  4311. found, so if you're looking only for a specific attribute, you
  4312. will need to test the results using GetAttrFx.
  4313.  
  4314. Routines in this series include:
  4315.    FindFirstFx, FindNextFx, GetNameFx$, GetAttrFx%, GetDateFx$,
  4316.    GetTimeFx$, GetSizeFx&
  4317.  
  4318. These routines differ from the older FindFirstF-based series in
  4319. two major respects. They include a Buffer$ parameter, which
  4320. allows you to have more than one search going on at a time. This
  4321. makes it safe to use these routines in subprograms without
  4322. conflict with the main program. It also allows you to search
  4323. entire subdirectory trees recursively. The other major
  4324. difference is that many of these routines are coded as functions
  4325. for greater convenience.
  4326.  
  4327.    Buffer$ = SPACE$(64)
  4328.    FindFirstFx Buffer$, FileName$, FAttr%, ErrCode%
  4329.  
  4330. FileName$   name of file(s) for which to search
  4331. FAttr%      file attribute(s) to seek
  4332. -------
  4333. Buffer$     buffer used in search (init to 64 characters)
  4334. ErrCode%    error code (0 if no error, else no matching files)
  4335.  
  4336. Name  : FindNextA            (Find Next file in an Archive)
  4337. Class : Disk
  4338. Level : DOS
  4339.  
  4340. This routine is for use after FindFirstA, to find any additional
  4341. archived files which may match your search specifications.
  4342.  
  4343. Routines in this series include:
  4344.    FindFirstA, FindNextA, GetNameA, GetCRCA, GetCRCAL,
  4345.    GetDateA, GetTimeA, GetSizeAL, GetStoreA
  4346.  
  4347.    FindNextA ErrCode%
  4348.  
  4349. -------
  4350. ErrCode%    error code (0 if no error, else no matching files)
  4351.  
  4352. Name  : FindNextF            (Find Next File)
  4353. Class : Disk
  4354. Level : DOS
  4355.  
  4356. This routine is for use after FindFirstF, to find any additional
  4357. files which may match your search specifications.
  4358.  
  4359. Routines in this series include:
  4360.    FindFirstF, FindNextF, GetNameF, GetAttrF, GetDateF,
  4361.    GetTimeF, GetSizeFL
  4362.  
  4363.    FindNextF ErrCode%
  4364.  
  4365. -------
  4366. ErrCode%    error code (0 if no error, else no matching files)
  4367.  
  4368. Name  : FindNextFx           (Find Next File, Extended)
  4369. Class : Disk
  4370. Level : DOS
  4371.  
  4372. This routine is for use after FindFirstFx, to find any
  4373. additional files which may match your search specifications.
  4374.  
  4375. Routines in this series include:
  4376.    FindFirstFx, FindNextFx, GetNameFx$, GetAttrFx%, GetDateFx$,
  4377.    GetTimeFx$, GetSizeFx&
  4378.  
  4379.    FindNextFx Buffer$, ErrCode%
  4380.  
  4381. Buffer$     buffer used in search
  4382. -------
  4383. Buffer$     updated buffer
  4384. ErrCode%    error code (0 if no error, else no matching files)
  4385.  
  4386. Name  : FindPatch            (Find Patch location)
  4387. Class : Disk
  4388. Level : DOS
  4389.  
  4390. This is one of a set of routines that allow you to write
  4391. self-modifying code. Your program can patch DATA statements in
  4392. itself or in another program, allowing you to save configuration
  4393. information (for example) without having to create additional
  4394. data files.
  4395.  
  4396. In order for this routine to work, you must have a series of
  4397. DATA statements containing quoted strings of the maximum desired
  4398. length. The first DATA statement must contain a unique string,
  4399. as FindPatch will use it to locate the data block. Note that if
  4400. your program is patching itself, you must READ the unique string
  4401. rather than assigning it directly, to make sure it's unique. The
  4402. string must exist at only one place in the program.
  4403.  
  4404. See the PATCHER.BAS file if you would like clarification. This
  4405. little demo program, when compiled, will patch itself with
  4406. whatever you enter on the command line. For instance, if you
  4407. type PATCHER BANANA, it will store "BANANA" in its DATA
  4408. statement. PDEMO will not work in the QuickBASIC environment, of
  4409. course. You must compile it to an .EXE file.
  4410.  
  4411. You may compile the program using any switches. You may not use
  4412. the /E (/EXEPACK) switch for LINK, though, as this may alter the
  4413. program DATA area. Likewise, you must not use compression
  4414. utilities such as PKLite on the program.
  4415.  
  4416. Routines in this set include FindPatch, SetPatch, PatchDone.
  4417.  
  4418.    FindPatch FileName$, SearchSt$, ErrCode%
  4419.  
  4420. FileName$     name of the file to patch
  4421. SearchSt$     value of the first DATA statement
  4422. MoveBack%     not used
  4423. -------
  4424. ErrCode%      whether search worked (0 yes, <0 no, >0 Error)
  4425.  
  4426. Name  : FLock                (File Lock)
  4427. Class : Disk
  4428. Level : DOS
  4429.  
  4430. This routine locks any part of a file. It will typically be used
  4431. for random-access files in circumstances where the file needs to
  4432. be accessed by multiple programs at the same time. This routine
  4433. lets you lock just the part of the file you need to access,
  4434. allowing other programs to work with other parts of the file at
  4435. the same time. It is best to maintain the lock for the shortest
  4436. time possible, in case someone else needs the same data. The
  4437. ideal technique is to lock the area, read what data you need,
  4438. write any changes, and unlock the area as a single program
  4439. block.
  4440.  
  4441. Note that it is IMPORTANT to unlock the locked area before the
  4442. file is closed and before your program terminates. If the file
  4443. is not properly unlocked, it may be damaged. See also FUnlock.
  4444.  
  4445. This routine is used for occasions where you expect multiple
  4446. accesses to a single file, under networking or multitasking
  4447. conditions. For less demanding file sharing, it is safer to
  4448. simply lock the entire file when you open it-- see FOpen.
  4449.  
  4450.    FLock FileHandle%, StartPosn&, Bytes&, ErrCode%
  4451.  
  4452. FileHandle%    file handle
  4453. StartPosn&     starting offset (1 for first position)
  4454. Bytes&         number of bytes to lock
  4455. -------
  4456. ErrCode%       error code (0 if no error, else DOS error code)
  4457.  
  4458. Name  : FloorD#              (Floor, Double-precision)
  4459. Class : String
  4460. Level : Any
  4461.  
  4462. This function returns the largest integer less than or equal to
  4463. the number you give it. This is most often used for rounding.
  4464.  
  4465.    Result# = FloorD#(Nr#)
  4466.  
  4467. Nr#          number to process
  4468. -------
  4469. Result#      result
  4470.  
  4471. Name  : FloorS!              (Floor, Single-precision)
  4472. Class : String
  4473. Level : Any
  4474.  
  4475. This function returns the largest integer less than or equal to
  4476. the number you give it. This is most often used for rounding.
  4477.  
  4478.    Result! = FloorS!(Nr!)
  4479.  
  4480. Nr!          number to process
  4481. -------
  4482. Result!      result
  4483.  
  4484. Name  : Floppies             (Floppies installed)
  4485. Class : Equipment / Disk
  4486. Level : BIOS
  4487.  
  4488. The Floppies routine tells you how many floppy drives are
  4489. installed (0-4). See also Floppies2, a function version of this
  4490. routine.
  4491.  
  4492.    Floppies Drives%
  4493.  
  4494. -------
  4495. Drives%  number of floppy disk drives installed
  4496.  
  4497. Name  : Floppies2%           (Floppies installed)
  4498. Class : Equipment / Disk
  4499. Level : BIOS
  4500.  
  4501. The Floppies2 routine tells you how many floppy drives are
  4502. installed (0-4).
  4503.  
  4504.    Drives% = Floppies2%
  4505.  
  4506. -------
  4507. Drives%  number of floppy disk drives installed
  4508.  
  4509. Name  : FloppyType           (Floppy drive Type)
  4510. Class : Equipment / Disk
  4511. Level : Clone (AT)
  4512.  
  4513. This routine tells you what kinds of floppy drives are
  4514. installed, if any. A code is returned for each drive, as
  4515. follows:
  4516.  
  4517.    0    no drive
  4518.    1    5 1/4"    360K
  4519.    2    5 1/4"    1.2M
  4520.    3    3 1/2"    720K
  4521.    4    3 1/2"    1.44M
  4522.    5    3 1/2"    2.88M
  4523.  
  4524. Note that this routine supports a maximum of only two drives. It
  4525. is possible for a machine to have up to four drives, but there
  4526. is not currently any good way to find out about them.
  4527.  
  4528. FloppyType should only be used on AT-class machines. It will not
  4529. work on PC/XT computers and may cause unusual results if used on
  4530. such machines. It will also not work on some of the earliest AT
  4531. clone machines which didn't adhere to the standard CMOS format.
  4532.  
  4533.    FloppyType DriveA%, DriveB%
  4534.  
  4535. -------
  4536. DriveA%    drive type of first floppy drive
  4537. DriveB%    drive type of second floppy drive
  4538.  
  4539. Name  : FlushToDisk          (Flush file buffers To Disk)
  4540. Class : Disk
  4541. Level : DOS
  4542.  
  4543. This is a "file safety" routine for use with files opened by
  4544. FOpen1 or FCreate. Files are normally buffered by DOS, which
  4545. makes file handling faster but creates the danger of losing the
  4546. file if there is a crash or power outage. By flushing the file
  4547. to disk, you insure that it is updated to the current moment.
  4548.  
  4549. Note: this routine will need to temporarily create a new file
  4550. handle if DOS versions before 4.0 are used.
  4551.  
  4552.    FlushToDisk Handle%, ErrCode%
  4553.  
  4554. Handle%    handle of the file to flush
  4555. -------
  4556. ErrCode%   error code: 0 if none, else DOS Error
  4557.  
  4558. Name  : FOpen1               (File Open)
  4559. Class : Disk
  4560. Level : DOS
  4561.  
  4562. This routine opens an existing file for use with the PBClone
  4563. file handling routines. If you need to create a file that
  4564. doesn't already exist, use the FCreate routine instead.
  4565.  
  4566. The file may be opened for reading, writing, or both:
  4567.  
  4568.    0   Read
  4569.    1   Write
  4570.    2   Read/Write
  4571.  
  4572. You may specify a file sharing mode for use with networks and
  4573. multitaskers. This will only take effect if the DOS version is
  4574. 3.0 or later and if the DOS SHARE utility has been executed.
  4575. Otherwise, it will be ignored.
  4576.  
  4577.    0   Normal       compatibility mode: no file sharing
  4578.    1   Exclusive    no one else may access the file
  4579.    2   Deny Write   no one else may write to the file
  4580.    3   Deny Read    no one else may read from the file
  4581.    4   Deny None    anyone else may read from or write to file
  4582.  
  4583. Most of the time, "Deny Write" will be appropriate. This allows
  4584. others to read the file, but not to modify the file on you
  4585. unexpectedly.
  4586.  
  4587. See the discussion of predefined device handles at FClose1.
  4588.  
  4589.    FOpen1 FileName$, ReadWrite%, Sharing%, Handle%, ErrCode%
  4590.  
  4591. FileName$   name of the file to open
  4592. ReadWrite%  whether you want input, output, or both (see above)
  4593. Sharing%    file sharing mode (see above)
  4594. -------
  4595. Handle%    handle by which to access the file (if no error)
  4596. ErrCode%   error code: 0 if no error, else DOS Error
  4597.  
  4598. Name  : ForceMatch$          (Force Match of file to wildcard)
  4599. Class : Disk
  4600. Level : Any
  4601.  
  4602. The ForceMatch$ function allows you to mimic DOS commands that
  4603. operate on source file(s) and destination file(s). It forces a
  4604. source file name to match a specified pattern (which may contain
  4605. wildcards), producing an appropriate destination file name.
  4606.  
  4607. For example, if the source is "TESTNAME.BAS" and the pattern is
  4608. "?RUE*.*", the result would be "TRUENAME.BAS".
  4609.  
  4610. Consider the DOS command "COPY *.BAS A:*.BAK". The "*.BAK" part
  4611. is the desired pattern. The "*.BAS" part specifies which files
  4612. to copy to the new pattern. Each filename that matches "*.BAS"
  4613. is translated through the "*.BAK" pattern to give the
  4614. destination filename. The ForceMatch$ function is designed to do
  4615. this sort of translation for you.
  4616.  
  4617.    DestFile$ = ForceMatch$(Pattern$, SrcFile$)
  4618.  
  4619. Pattern$   pattern of desired file name (may contain wildcards)
  4620. SrcFile$   file name to force through the pattern
  4621. -------
  4622. DestFile$  resulting file name
  4623.  
  4624. Name  : FormatDate           (Format Date)
  4625. Class : Time
  4626. Level : Any
  4627.  
  4628. This is a highly flexible date formatting routine. It accepts a
  4629. date in one of the usual American formats ("03-22-1990",
  4630. "03/22/90", or even "3/22/90") and converts it according to a
  4631. format string. This format string allows you to normalize the
  4632. date, select a new delimiter, choose between two-digit and
  4633. four-digit years, and even change the order from month/day/year
  4634. to anything else. An error code will be returned if the date is
  4635. not valid.
  4636.  
  4637. The format string can be as simple as "##/##/##", which
  4638. specifies that the usual month/day/year order be used, with a
  4639. delimiter of "/" and a two-digit year. If you want to change the
  4640. date order, you would need a format like "DD.MM.YYYY" instead.
  4641. For sorting or storage, you might want to convert the date to a
  4642. plain number, using a format string like "YYYYMMDD". The result
  4643. could then be converted to a LONG with the BASIC VAL function.
  4644.  
  4645.    FormatDate DateSt$, Format$, Result$, ErrCode%
  4646.  
  4647. DateSt$     date to format (month, day, year order)
  4648. Format$     format for the date
  4649. -------
  4650. Result$     resulting date
  4651. ErrCode     whether the date is valid (0 ok)
  4652.  
  4653. Name  : FormatPhone$         (Format Phone number)
  4654. Class : String
  4655. Level : Any
  4656.  
  4657. This function formats a phone number using the standard U.S.
  4658. notation. The phone number is passed as a string. This string is
  4659. screened of any invalid phone number characters and is then
  4660. formatted according to its length into one of the following:
  4661.  
  4662.    "1234"
  4663.    "555-1234"
  4664.    "(303) 555-1234"
  4665.  
  4666. Valid characters are all digits and letters except for Q and Z.
  4667. Letters are capitalized by the routine. A leading "1" may be
  4668. present if there is an area code-- if so, it is removed. Phone
  4669. numbers which are the wrong length will cause a null string ("")
  4670. to be returned.
  4671.  
  4672. See also StripChar, which will allow you to undo formatting.
  4673.  
  4674.    Phone$ = FormatPhone$(RawNr$)
  4675.  
  4676. RawNr$      unformatted phone number
  4677. -------
  4678. Phone$      formatted phone number ("" if invalid)
  4679.  
  4680. Name  : FReadLine            (File Read Line)
  4681. Class : Disk
  4682. Level : DOS
  4683.  
  4684. This routine works like LINE INPUT-- it reads in an entire line
  4685. of text from a file. The Dest$ variable must be set to the
  4686. desired maximum length beforehand. On return, the number of
  4687. characters is returned in DLen%, and TooLong% will be set if the
  4688. Dest$ variable is full and a carriage return/linefeed pair was
  4689. not (yet?) found.
  4690.  
  4691.    Dest$ = SPACE$(MaxLength%)
  4692.    FReadLine Handle%, Dest$, DLen%, TooLong%, ErrCode%
  4693.    Dest$ = LEFT$(Dest$, DLen%)
  4694.  
  4695. Handle%    handle of the file
  4696. -------
  4697. Dest$      result (init to max length first)
  4698. DLen%      number of characters in result
  4699. TooLong%   zero if we read it all, -1 if CR/LF not found
  4700. ErrCode%   zero if no error, else DOS error code
  4701.  
  4702. Name  : FromPostal$          (From Postal Abbreviation)
  4703. Class : String
  4704. Level : Any
  4705.  
  4706. This function returns the state name corresponding to a given
  4707. two-letter postal abbreviation. It handles all U.S. postal
  4708. abbreviations, including states (e.g., "AZ" = "Arizona") and a
  4709. number of other countries (e.g., "PR" = "Puerto Rico"). A null
  4710. string ("") is returned if the specified abbreviation is not a
  4711. valid code.
  4712.  
  4713. The conversion can also be done the other way around-- see the
  4714. ToPostal$ function.
  4715.  
  4716.    PlaceName$ = FromPostal$(Abbrev$)
  4717.  
  4718. Abbrev$      two-letter postal abbreviation
  4719. -------
  4720. PlaceName$   place name corresponding with abbreviation
  4721.  
  4722. Name  : FSetEnd              (File Set to End)
  4723. Class : Disk
  4724. Level : DOS
  4725.  
  4726. This moves the file pointer to the end of the file. It is for
  4727. use with files opened by FOpen1 or FCreate. The usual purpose
  4728. for this is to append information to an existing file.
  4729.  
  4730. Note that some text files may have a Control-Z or CHR$(26) on
  4731. the end. For historical reasons, this character is sometimes
  4732. used as an "end of file" marker. When dealing with text files,
  4733. you may want to examine the last character of the file to make
  4734. sure it isn't a Control-Z.
  4735.  
  4736. Some of Microsoft's BASIC compilers are among the programs
  4737. which, unfortunately, put a Control-Z at the end of a file (if
  4738. you OPEN for OUTPUT).
  4739.  
  4740.    FSetEnd Handle%
  4741.  
  4742. Handle%    handle of the file
  4743.  
  4744. Name  : FSetLoc              (File Set Location to byte)
  4745. Class : Disk
  4746. Level : DOS
  4747.  
  4748. This moves the file pointer to a specified position in the file.
  4749. It is for use with files opened by FOpen1 or FCreate. File
  4750. positions are considered to start at 1.
  4751.  
  4752.    FSetLoc Handle%, Posn&
  4753.  
  4754. Handle%    handle of the file
  4755. Posn&      location to which to move
  4756.  
  4757. Name  : FSetOfs              (File Set location by Offset)
  4758. Class : Disk
  4759. Level : DOS
  4760.  
  4761. This moves the file pointer backwards or forwards in the file.
  4762. It is for use with files opened by FOpen1 or FCreate.
  4763.  
  4764.    FSetOfs Handle%, Offset&
  4765.  
  4766. Handle%    handle of the file
  4767. Offset&    number of bytes by which to move
  4768.  
  4769. Name  : FSetRec              (File Set location to Record)
  4770. Class : Disk
  4771. Level : DOS
  4772.  
  4773. This sets the file pointer to a specific record in the file. It
  4774. is for use with files opened by FOpen1 or FCreate.
  4775.  
  4776. This routine provides the same function as FSetLoc, but is a bit
  4777. more convenient for dealing with files composed of fixed-length
  4778. records.
  4779.  
  4780.    FSetRec Handle%, RecSize%, RecNr%
  4781.  
  4782. Handle%    handle of the file
  4783. RecSize%   number of bytes per record
  4784. RecNr%     number of record (starting at 1)
  4785.  
  4786. Name  : FSetSize             (File Set Size)
  4787. Class : Disk
  4788. Level : DOS
  4789.  
  4790. Many people have asked how to delete information from a file.
  4791. Well, there's no straightforward way to do it most of the time,
  4792. but if the record is at the end of the file, you can chop it
  4793. right off.
  4794.  
  4795. This routine can also be used to make a file larger, perhaps
  4796. pre-allocating space that will be used later (for better speed).
  4797.  
  4798. The file in question must have been opened by FCreate or FOpen1.
  4799.  
  4800.    FSetSize Handle%, Bytes&
  4801.  
  4802. Handle%    handle of the file
  4803. Bytes&     desired file size, in bytes
  4804.  
  4805. Name  : FSize                (File get Size)
  4806. Class : Disk
  4807. Level : DOS
  4808.  
  4809. This routine allows you to get the size of a file that was
  4810. opened by FOpen1 or FCreate.
  4811.  
  4812. See also FSize2, the FUNCTION version of this routine.
  4813.  
  4814.    FSize Handle%, Bytes&
  4815.  
  4816. Handle%    handle of the file
  4817. -------
  4818. Bytes&     file size, in bytes
  4819.  
  4820. Name  : FSize2&              (File get Size)
  4821. Class : Disk
  4822. Level : DOS
  4823.  
  4824. This routine allows you to get the size of a file that was
  4825. opened by FOpen1 or FCreate.
  4826.  
  4827. See also FSize, the Sub version of this routine.
  4828.  
  4829.    Bytes& = FSize2&(Handle%)
  4830.  
  4831. Handle%    handle of the file
  4832. -------
  4833. Bytes&     file size, in bytes
  4834.  
  4835. Name  : FUnlock              (File Unlock)
  4836. Class : Disk
  4837. Level : DOS
  4838.  
  4839. This routine unlocks any part of a file. It is used to undo the
  4840. effects of FLock, which locks any part of a file. It is
  4841. important to pass the exact same parameters to FUnlock as you
  4842. did to FLock. See also FLock.
  4843.  
  4844. Note that it is IMPORTANT to unlock the locked area before the
  4845. file is closed and before your program terminates. If the file
  4846. is not properly unlocked, it may be damaged.
  4847.  
  4848.    FUnlock FileHandle%, StartPosn&, Bytes&, ErrCode%
  4849.  
  4850. FileHandle%    file handle
  4851. StartPosn&     starting offset (1 for first position)
  4852. Bytes&         number of bytes to unlock
  4853. -------
  4854. ErrCode%       error code (0 if no error, else DOS error code)
  4855.  
  4856. Name  : Get4DOSv             (Get 4DOS Version)
  4857. Class : Equipment
  4858. Level : DOS
  4859.  
  4860. The Get4DOSv routine returns the version of 4DOS being used. It
  4861. returns the results as two integers containing the major and
  4862. minor version numbers. For instance, 4DOS 4.0 would return a
  4863. major number of 4, minor 0. If 4DOS is not installed, both
  4864. version numbers will be zero.
  4865.  
  4866. If you're not familiar with 4DOS, it's a terrific improved
  4867. replacement for COMMAND.COM. For more information, write JP
  4868. Software Inc., P.O. Box 1470, Arlington MA 02174, or call your
  4869. local BBS.
  4870.  
  4871.    Get4DOSv MajorV%, MinorV%
  4872.  
  4873. -------
  4874. MajorV%   major part of the 4DOS version
  4875. MinorV%   minor part of the 4DOS version
  4876.  
  4877. Name  : GetAttrF             (Get Attribute of File)
  4878. Class : Disk
  4879. Level : DOS
  4880.  
  4881. The GetAttrF routine returns the attributes of a file matched by
  4882. FindFirstF or FindNextF.
  4883.  
  4884.    Normal          0      (nothing special)
  4885.    Read Only       1      file can be read, but not written to
  4886.    Hidden          2      file is "invisible"
  4887.    System          4      special DOS system file
  4888.    Subdirectory   16      subdirectory
  4889.    Archive        32      (used by some backup utilities)
  4890.  
  4891. You can see if a certain value is set using the AND operator:
  4892.  
  4893.    IF FAttr% AND 16 THEN PRINT "Subdirectory"
  4894.  
  4895. Since the values are all powers of two, the AND operator makes
  4896. for a convenient way of decoding the results.
  4897.  
  4898. See also the ExplainFAttr$ function, which decodes the meanings
  4899. of the attribute for you.
  4900.  
  4901. Routines in this series include:
  4902.    FindFirstF, FindNextF, GetNameF, GetAttrF, GetDateF,
  4903.    GetTimeF, GetSizeFL
  4904.  
  4905.    GetAttrF FAttr%
  4906.  
  4907. -------
  4908. FAttr%   attributes that are set
  4909.  
  4910. Name  : GetAttrFx%           (Get Attribute of File, Extended)
  4911. Class : Disk
  4912. Level : DOS
  4913.  
  4914. The GetAttrFx% function returns the attributes of a file matched
  4915. by FindFirstFx or FindNextFx.
  4916.  
  4917.    Normal          0      (nothing special)
  4918.    Read Only       1      file can be read, but not written to
  4919.    Hidden          2      file is "invisible"
  4920.    System          4      special DOS system file
  4921.    Subdirectory   16      subdirectory
  4922.    Archive        32      (used by some backup utilities)
  4923.  
  4924. You can see if a certain value is set using the AND operator:
  4925.  
  4926.    IF FAttr% AND 16 THEN PRINT "Subdirectory"
  4927.  
  4928. Since the values are all powers of two, the AND operator makes
  4929. for a convenient way of decoding the results.
  4930.  
  4931. See also the ExplainFAttr$ function, which decodes the meanings
  4932. of the attribute for you.
  4933.  
  4934. Routines in this series include:
  4935.    FindFirstFx, FindNextFx, GetNameFx$, GetAttrFx%, GetDateFx$,
  4936.    GetTimeFx$, GetSizeFx&
  4937.  
  4938.    FAttr% = GetAttrFx%(Buffer$)
  4939.  
  4940. Buffer$   buffer used in search
  4941. -------
  4942. FAttr%    file attributes
  4943.  
  4944. Name  : GetColor             (Get Color)
  4945. Class : Display
  4946. Level : Clone
  4947.  
  4948. This routine tells you the current default foreground and
  4949. background colors being used by BASIC. It should be used only in
  4950. text modes.
  4951.  
  4952.    GetColor Foreground%, Background%
  4953.  
  4954. -------
  4955. Foreground%   foreground color
  4956. Background%   background color
  4957.  
  4958. Name  : GetCommAddr          (Get Comm Address)
  4959. Class : Serial
  4960. Level : Clone
  4961.  
  4962. This routine allows you to determine the base port address of a
  4963. serial port. You tell it the COM port number (1-4) and it
  4964. returns the port address. If there is no port installed, zero
  4965. will be returned.
  4966.  
  4967. Note that ports are "supposed" to be assigned sequentially-- in
  4968. other words, if you find a "zero" port address, there will be no
  4969. ports after that. This is not necessarily the case, however.
  4970. Some semi-standard machines may have a COM2 without a COM1, for
  4971. instance. QuickBASIC gets confused in that case, but it's no
  4972. problem with my PBClone or BasWiz libraries.
  4973.  
  4974. Aside from purely informational purposes, this routine can be
  4975. useful in conjunction with SetCommAddr in manipulating the
  4976. serial ports.
  4977.  
  4978.    GetCommAddr PortNr%, PortAddr%
  4979.  
  4980. PortNr%     COM port number (1-4)
  4981. -------
  4982. PortAddr%   port address
  4983.  
  4984. Name  : GetCRCA              (Get CRC of Archive file)
  4985. Class : Disk / Time
  4986. Level : DOS
  4987.  
  4988. GetCRCA returns the 16-bit CRC of an archived file matched by
  4989. the FindFirstA or FindNextA routines. Since some archives use
  4990. 32-bit CRCs, you may wish to use the more generic version of
  4991. this routine, GetCRCAL.
  4992.  
  4993. Routines in this series include:
  4994.    FindFirstA, FindNextA, GetNameA, GetCRCA, GetCRCAL,
  4995.    GetDateA, GetTimeA, GetSizeAL, GetStoreA
  4996.  
  4997.    GetCRCA CRC16%
  4998.  
  4999. -------
  5000. CRC16%     16-bit CRC
  5001.  
  5002. Name  : GetCRCAL             (Get CRC of Archive file as Long)
  5003. Class : Disk / Time
  5004. Level : DOS
  5005.  
  5006. GetCRCAL returns the 32-bit CRC of an archived file matched by
  5007. the FindFirstA or FindNextA routines. If the archive only has a
  5008. 16-bit CRC, the result is converted to 32 bits, so this routine
  5009. works with all archives.
  5010.  
  5011. Routines in this series include:
  5012.    FindFirstA, FindNextA, GetNameA, GetCRCA, GetCRCAL,
  5013.    GetDateA, GetTimeA, GetSizeAL, GetStoreA
  5014.  
  5015.    GetCRCAL CRC32%
  5016.  
  5017. -------
  5018. CRC32%     32-bit CRC
  5019.  
  5020. Name  : GetCRT               (Get CRT)
  5021. Class : Display / Equipment
  5022. Level : Clone
  5023.  
  5024. The GetCRT routine simply tells you whether the current display
  5025. is capable of handling colors or not. An unsophisticated
  5026. routine, GetCRT assumes that if the display is an MDA/Hercules,
  5027. it can't do color, but otherwise it can.
  5028.  
  5029. See also GetEGA, GetHGA and GetVGA.
  5030.  
  5031.    GetCRT Colour%
  5032.  
  5033. -------
  5034. Colour%   whether the display is color (0 if no)
  5035.  
  5036. Name  : GetCRT2%             (Get CRT)
  5037. Class : Display / Equipment
  5038. Level : Clone
  5039.  
  5040. The GetCRT2 routine simply tells you whether the current display
  5041. is capable of handling colors or not. An unsophisticated
  5042. routine, GetCRT2 assumes that if the display is an MDA/Hercules,
  5043. it can't do color, but otherwise it can.
  5044.  
  5045. See also GetEGA, GetHGA and GetVGA.
  5046.  
  5047.    Colour% = GetCRT%
  5048.  
  5049. -------
  5050. Colour%   whether the display is color (0 if no)
  5051.  
  5052. Name  : GetDateA             (Get Date of Archive file)
  5053. Class : Disk / Time
  5054. Level : DOS
  5055.  
  5056. GetDateA returns the date of a archived file matched by the
  5057. FindFirstA or FindNextA routines.
  5058.  
  5059. Routines in this series include:
  5060.    FindFirstA, FindNextA, GetNameA, GetCRCA, GetCRCAL,
  5061.    GetDateA, GetTimeA, GetSizeAL, GetStoreA
  5062.  
  5063.    GetDateA MonthNr%, DayNr%, YearNr%
  5064.  
  5065. -------
  5066. MonthNr%    month
  5067. DayNr%      day
  5068. YearNr%     year
  5069.  
  5070. Name  : GetDateAT            (Get Date from AT clock)
  5071. Class : Time
  5072. Level : BIOS (AT)
  5073.  
  5074. This routine gets the date from the hardware real-time clock in
  5075. AT-class computers. Depending on the DOS version, this date may
  5076. be partially or completely independent of the date kept by DOS
  5077. in software. DOS always reads the date from the hardware clock
  5078. when it starts up. However, use of the DATE command in DOS (and
  5079. the DATE$ function in QuickBASIC) may relate only to the
  5080. software copy of the date, which is not always guaranteed to be
  5081. the same as the date in the hardware clock due to certain
  5082. discrepancies in DOS.
  5083.  
  5084.    GetDateAT MonthNr%, DayNr%, YearNr%, ErrCode%
  5085.  
  5086. -------
  5087. MonthNr%     month number (1-12)
  5088. DayNr%       day (1-31)
  5089. YearNr%      year (1980-2079)
  5090. ErrCode%     error code: 0 if no error, else clock has stopped
  5091.  
  5092. Name  : GetDateF             (Get Date of File)
  5093. Class : Disk / Time
  5094. Level : DOS
  5095.  
  5096. The GetDateF routine returns the date of a file matched by
  5097. FindFirstF or FindNextF.
  5098.  
  5099. Routines in this series include:
  5100.    FindFirstF, FindNextF, GetNameF, GetAttrF, GetDateF,
  5101.    GetTimeF, GetSizeFL
  5102.  
  5103.    GetDateF MonthNr%, DayNr%, YearNr%
  5104.  
  5105. -------
  5106. MonthNr%    month
  5107. DayNr%      day
  5108. YearNr%     year
  5109.  
  5110. Name  : GetDateFx$           (Get Date of File, Extended)
  5111. Class : Disk / Time
  5112. Level : DOS
  5113.  
  5114. The GetDateFx$ function returns the date of a file matched by
  5115. FindFirstFx or FindNextFx.
  5116.  
  5117. Routines in this series include:
  5118.    FindFirstFx, FindNextFx, GetNameFx$, GetAttrFx%, GetDateFx$,
  5119.    GetTimeFx$, GetSizeFx&
  5120.  
  5121.    FileDate$ = GetDateFx$(Buffer$)
  5122.  
  5123. Buffer$     buffer used in search
  5124. -------
  5125. FileDate$   date of file (e.g., "02-28-1991")
  5126.  
  5127. Name  : GetDOSv              (Get DOS Version)
  5128. Class : Equipment
  5129. Level : DOS
  5130.  
  5131. The GetDOSv routine tells you what version of DOS you're using.
  5132. It returns the results as two integers containing the major and
  5133. minor version numbers. For instance, MS-DOS 2.11 would return a
  5134. major number of 2, minor 11.
  5135.  
  5136. The OS/2 compatibility box returns version numbers beginning at
  5137. 10.00. For instance, OS/2 v1.1 returns 10.10 and OS/2 v2.0
  5138. returns 20.00.
  5139.  
  5140.    GetDOSv MajorV%, MinorV%
  5141.  
  5142. -------
  5143. MajorV%   major part of the DOS version
  5144. MinorV%   minor part of the DOS version
  5145.  
  5146. Name  : GetDrive$            (Get default Drive)
  5147. Class : Disk
  5148. Level : DOS
  5149.  
  5150. This routine tells you the letter of the current default drive.
  5151.  
  5152. See also GetDrv, the SUB version of this routine.
  5153.  
  5154.    Drive$ = GetDrive$
  5155.  
  5156. -------
  5157. Drive$    default drive letter.
  5158.  
  5159. Name  : GetDrv               (Get default Drive)
  5160. Class : Disk
  5161. Level : DOS
  5162.  
  5163. This routine tells you the letter of the current default drive.
  5164.  
  5165. See also GetDrive, the FUNCTION version of this routine.
  5166.  
  5167.    Drive$ = "x"
  5168.    GetDrv Drive$
  5169.  
  5170. -------
  5171. Drive$    default drive letter.  Init to at least one character.
  5172.  
  5173. Name  : GetDView             (Get DESQview version)
  5174. Class : Miscellaneous
  5175. Level : DOS
  5176.  
  5177. The GetDView routine tells you what version of DESQview is
  5178. loaded. It returns the results as two integers containing the
  5179. major and minor version numbers. For instance, DESQview 2.0
  5180. would return a major number of 2 and a minor number of 0. If
  5181. DESQview is not loaded, zeroes are returned.
  5182.  
  5183. See also GetTView, GetTVScreen, UpdTVScreen.
  5184.  
  5185.    GetDView MajorV%, MinorV%
  5186.  
  5187. -------
  5188. MajorV%   major part of the DESQview version (0 if no DESQview)
  5189. MinorV%   minor part of the DESQview version
  5190.  
  5191. Name  : GetEGA               (Get EGA information)
  5192. Class : Display / Equipment
  5193. Level : BIOS
  5194.  
  5195. This routine tells you whether an EGA (or VGA) is available, and
  5196. if so, what kind. It tells you whether the attached display is
  5197. monochrome or color, and how many kilobytes of RAM are installed
  5198. in the adapter.
  5199.  
  5200. Many early EGAs had only 64K of RAM. Current adapters have 256K
  5201. or more. Since there are some limitations attached to having
  5202. only 64K, it's a good idea to see if this is the case-- most
  5203. PBClone EGA routines won't work properly on 64k adapters.
  5204.  
  5205. See also GetCRT, GetHGA and GetVGA.
  5206.  
  5207. See also GetEGA2, the FUNCTION version of this routine.
  5208.  
  5209.    GetEGA Display%, KBytes%
  5210.  
  5211. -------
  5212. Display%  EGA display type: 0 no EGA, 1 EGA color, 2 EGA mono
  5213. KBytes%   kilobytes of display memory
  5214.  
  5215. Name  : GetEGA2%             (Get EGA information)
  5216. Class : Display / Equipment
  5217. Level : BIOS
  5218.  
  5219. This routine tells you whether an EGA (or VGA) is available.
  5220.  
  5221. See also GetCRT2, GetHGA and GetVGA2.
  5222.  
  5223. See also GetEGA, the SUB version of this routine. It returns
  5224. additional information.
  5225.  
  5226.    IsEGA% = GetEGA2%
  5227.  
  5228. -------
  5229. IsEGA%    whether the display is an EGA (0 if no)
  5230.  
  5231. Name  : GetError             (Get Error code from DOS)
  5232. Class : Miscellaneous
  5233. Level : Clone
  5234.  
  5235. NOTE: The GetError2% function should be used in preference to
  5236. this routine.
  5237.  
  5238. The GetError routine is used in conjunction with CatchError. It
  5239. lets you get the exit code (error level) returned by a program
  5240. to which you have SHELLed. Since CatchError hooks an interrupt
  5241. to do its work, you must always make sure to use GetError
  5242. afterwards to "clean up". See also CatchError.
  5243.  
  5244. Note that differences in DOS mean that this routine will not
  5245. always work. In some versions of DOS, you can only get the error
  5246. level if a batch file was executed; in others, you can't get the
  5247. error level from a batch file at all. Sorry about that. I don't
  5248. know of any way to work around it.
  5249.  
  5250.    CatchError
  5251.    SHELL ProgramName$
  5252.    GetError ExitCode%
  5253.  
  5254. -------
  5255. ExitCode%   exit code returned by SHELLed-to program (0-255)
  5256.  
  5257. Name  : GetError2%           (Get Error code from DOS)
  5258. Class : Miscellaneous
  5259. Level : DOS
  5260.  
  5261. The GetError2% function gets the exit code (error level)
  5262. returned by a program to which you have SHELLed. It should be
  5263. used as soon as possible after the SHELL, and its value will
  5264. only be meaningful on the first call after the SHELL.
  5265.  
  5266. This routine should be used in preference to CatchError and
  5267. GetError.
  5268.  
  5269.    SHELL ProgramName$
  5270.    ExitCode% = GetError2%
  5271.  
  5272. -------
  5273. ExitCode%   exit code returned by SHELLed-to program (0-255)
  5274.  
  5275. Name  : GetExecPath          (Get Execution Path of program)
  5276. Class : Disk
  5277. Level : DOS 3.0+
  5278.  
  5279. This routine returns the full path of your program, i.e., the
  5280. drive, subdirectory, and name of the program. It does not rely
  5281. on the current drive and subdirectory settings or look at the
  5282. PATH setting-- DOS tells it directly. This makes it an excellent
  5283. way to find the program's "home" directory, where (hopefully)
  5284. any data files associated with the program will also be stored.
  5285.  
  5286.    SelfName$ = SPACE$(80)
  5287.    GetExecPath SelfName$, SelfLen%
  5288.    SelfName$ = LEFT$(SelfName$, SelfLen%)
  5289.  
  5290. -------
  5291. SelfName$   full path for current program.  Init to 80+ chars.
  5292. SelfLen%    length of the full path spec.
  5293.  
  5294. Name  : GetExtM              (Get Extended Memory)
  5295. Class : Memory / Equipment
  5296. Level : BIOS (AT)
  5297.  
  5298. This routine allows you to find out how much extended memory is
  5299. available. It should only be used on AT-class computers, since
  5300. older PCs do not support extended memory. Note that some of the
  5301. very early AT machines will return erroneous results.
  5302.  
  5303. The amount of memory returned may be either the total amount of
  5304. extended memory installed or just the amount available at this
  5305. time, depending on how previously-installed programs (if any)
  5306. make use of extended memory. Unfortunately, there is no standard
  5307. which defines how a program should use extended memory as there
  5308. is with EMS (expanded memory), so there is no way for a program
  5309. to determine whether or how another program is using extended
  5310. memory. Microsoft is trying to clear up this situation with its
  5311. HIMEM driver (available at your local BBS, or [last I looked]
  5312. free from Microsoft), but this approach hasn't really become
  5313. standard yet.
  5314.  
  5315.    GetExtM KBytes%
  5316.  
  5317. -------
  5318. KBytes%    the number of kilobytes of extended memory
  5319.  
  5320. Name  : GetFAttr             (Get File Attribute)
  5321. Class : Disk
  5322. Level : DOS
  5323.  
  5324. This routine lets you read the attributes of a file or
  5325. subdirectory. The attributes may contain a combination of any of
  5326. the following:
  5327.  
  5328.    Normal          0      (nothing special)
  5329.    Read Only       1      file can be read, but not written to
  5330.    Hidden          2      file is "invisible"
  5331.    System          4      special DOS system file
  5332.    Subdirectory   16      subdirectory
  5333.    Archive        32      (used by some backup utilities)
  5334.  
  5335. You can see if a certain value is set by using the AND operator:
  5336.  
  5337.    IF FAttr% AND 2 THEN PRINT "Hidden file"
  5338.  
  5339. Since the values are all powers of two, the AND operator makes
  5340. for a convenient way of decoding the results.
  5341.  
  5342. See also the ExplainFAttr$ function, which decodes the meanings
  5343. of the attribute for you.
  5344.  
  5345.    GetFAttr FileName$, FAttr%
  5346.  
  5347. FileName$   name of the file (or subdirectory) to examine
  5348. -------
  5349. FAttr%      attributes that are set
  5350.  
  5351. Name  : GetFDate             (Get File Date)
  5352. Class : Disk / Time
  5353. Level : DOS
  5354.  
  5355. This routine gets the date of a file.
  5356.  
  5357.    GetFDate FileName$, MonthNr%, DayNr%, YearNr%
  5358.  
  5359. FileName$   name of the file to examine
  5360. -------
  5361. MonthNr%    month
  5362. DayNr%      day
  5363. YearNr%     year
  5364.  
  5365. Name  : GetFSize             (Get File Size)
  5366. Class : Disk
  5367. Level : DOS
  5368.  
  5369. This function gets the size of a file.
  5370.  
  5371.    FileSize& = GetFSize&(FileName$)
  5372.  
  5373. FileName$   name of the file to examine
  5374. -------
  5375. FileSize&   size of the file, in bytes
  5376.  
  5377. Name  : GetFTime             (Get File Time)
  5378. Class : Disk / Time
  5379. Level : DOS
  5380.  
  5381. This routine gets the time of a file.
  5382.  
  5383.    GetFTime FileName$, HourNr%, MinuteNr%, SecondNr%
  5384.  
  5385. FileName$     name of the file to examine
  5386. -------
  5387. HourNr%       hour
  5388. MinuteNr%     minute
  5389. SecondNr%     second (always even, due to DOS storage techniques)
  5390.  
  5391. Name  : GetHGA%              (Get Hercules Adapter info)
  5392. Class : Display / Equipment
  5393. Level : Clone
  5394.  
  5395. This routine tells you whether a Hercules-compatible monochrome
  5396. graphics adapter is in use.
  5397.  
  5398. See also GetCRT2, GetEGA and GetVGA2.
  5399.  
  5400.    IsHGA% = GetHGA%
  5401.  
  5402. -------
  5403. IsHGA%    whether the display is Hercules mono graphics (0 no)
  5404.  
  5405. Name  : GetKbd               (Get Keyboard toggles)
  5406. Class : Input
  5407. Level : Clone
  5408.  
  5409. The GetKbd routine allows you to get the state of the four
  5410. keyboard toggles: Insert, Caps lock, Num lock, and Scroll Lock.
  5411.  
  5412.    GetKbd Insert%, Caps%, Num%, Scrl%
  5413.  
  5414. -------
  5415. Insert%    whether "insert" mode is on (0 if no)
  5416. Caps%      whether "caps lock" is on (0 if no)
  5417. Num%       whether "num lock" is on (0 if no)
  5418. Scrl%      whether "scroll lock" is on (0 if no)
  5419.  
  5420. Name  : GetKbd1              (Get Keyboard Shifts)
  5421. Class : Input
  5422. Level : Clone
  5423.  
  5424. The GetKbd1 routine allows you to get the state of the four
  5425. keyboard shift keys: Left shift, Right shift, Control and Alt.
  5426.  
  5427.    GetKbd1 LShift%, RShift%, Control%, Alt%
  5428.  
  5429. -------
  5430. LShift%    whether the left shift key is depressed (0 if no)
  5431. RShift%    whether the right shift key is depressed (0 if no)
  5432. Control%   whether a control key is depressed (0 if no)
  5433. Alt%       whether an alt key is depressed (0 if no)
  5434.  
  5435. Name  : GetKbd2              (Get Keyboard Shifts)
  5436. Class : Input
  5437. Level : AT BIOS
  5438.  
  5439. The GetKbd2 routine allows you to get the state of the six
  5440. keyboard shift keys on an "enhanced" keyboard: Left shift, Right
  5441. shift, Left Control, Right Control, Left Alt and Right Alt.
  5442.  
  5443. Normally, the BIOS only lets you see one key at a time, which
  5444. can be a barrier when you need more input. This is a particular
  5445. problem with action games and other real-time applications which
  5446. have complex input requirements. Due to the special way the BIOS
  5447. treats shift keys, GetKbd2 can tell if the the various shift
  5448. keys are pressed simultaneously, allowing more flexibility.
  5449.  
  5450.    GetKbd2 LShift%, RShift%, LCtrl%, RCtrl%, LAlt%, RAlt%
  5451.  
  5452. -------
  5453. LShift%    whether the left shift key is depressed (0 if no)
  5454. RShift%    whether the right shift key is depressed (0 if no)
  5455. LCtrl%     whether the left control key is depressed (0 if no)
  5456. RCtrl%     whether the right control key is depressed (0 if no)
  5457. LAlt%      whether the left alt key is depressed (0 if no)
  5458. RAlt%      whether the right alt key is depressed (0 if no)
  5459.  
  5460. Name  : GetKey               (Get Key or mouse)
  5461. Class : Input, Mouse
  5462. Level : BIOS
  5463.  
  5464. This routine is kind of an extended version of INPUT$. It waits
  5465. until a key is available at the keyboard and returns the key
  5466. pressed. At your option, it can also return if a mouse button is
  5467. pressed.
  5468.  
  5469. See also the LClickLoc and RClickLoc routines, which allow you
  5470. to determine what the mouse position was at the last click.
  5471.  
  5472.    GetKey Mouse%, ASCIIcode%, ScanCode%, LButton%, RButton%
  5473.  
  5474. Mouse%        whether to check the mouse (0: no)
  5475. -------
  5476. ASCIIcode%    ASCII code of the key pressed
  5477. ScanCode%     scan code of the key pressed (0 if none)
  5478. LButton%      whether the left  mouse button was pressed
  5479. RButton%      whether the right mouse button was pressed
  5480.  
  5481. Name  : GetKey3              (Get Key or 3-button mouse)
  5482. Class : Input, Mouse
  5483. Level : BIOS
  5484.  
  5485. This routine is kind of an extended version of INPUT$. It waits
  5486. until a key is available at the keyboard and returns the key
  5487. pressed. At your option, it can also return if a mouse button is
  5488. pressed.
  5489.  
  5490. See also the LClickLoc, MClickLoc and RClickLoc routines, which
  5491. allow you to determine what the mouse position was at the last
  5492. click.
  5493.  
  5494.    GetKey3 Mouse%, ASCIIcode%, ScanCode%, LButton%,
  5495.       MButton%, RButton%
  5496.  
  5497. Mouse%        whether to check the mouse (0: no)
  5498. -------
  5499. ASCIIcode%    ASCII code of the key pressed
  5500. ScanCode%     scan code of the key pressed (0 if none)
  5501. LButton%      whether the left   mouse button is pressed
  5502. MButton%      whether the middle mouse button is pressed
  5503. RButton%      whether the right  mouse button is pressed
  5504.  
  5505. Name  : GetLabel             (Get disk volume Label)
  5506. Class : Disk
  5507. Level : DOS
  5508.  
  5509. This routine gets the volume label from a specified drive. See
  5510. also GetLabel2$.
  5511.  
  5512.    Label$ = SPACE$(11)
  5513.    GetLabel Drive$, Label$, LabelLen%, ErrCode%
  5514.    Label$ = LEFT$(Label$, LabelLen%)
  5515.  
  5516. Drive$     letter of the drive to examine
  5517. -------
  5518. Label$     volume label of drive.  Init to >= 11 chars.
  5519. LabelLen%  length of the volume label
  5520. ErrCode%   error code: 0 if no error, else DOS Error
  5521.  
  5522. Name  : GetLabel2$           (Get disk volume Label)
  5523. Class : Disk
  5524. Level : DOS
  5525.  
  5526. This routine gets the volume label from a specified drive. See
  5527. also GetLabel, a subprogram version of this routine. The
  5528. GetLabel subprogram is preferable in that it returns an error
  5529. code, but you may find the function version more convenient if
  5530. error checking is not desired.
  5531.  
  5532.    Label$ = GetLabel2$(Drive$)
  5533.  
  5534. Drive$     letter of the drive to examine
  5535. -------
  5536. Label$     volume label of the specified drive.
  5537.  
  5538. Name  : GetLIMHandles        (Get L/I/M expanded mem Handles)
  5539. Class : Memory
  5540. Level : DOS
  5541.  
  5542. Early Lotus/Intel/Microsoft expanded memory revisions provided a
  5543. limited number of "handles" which could be used to access
  5544. expanded memory-- often as few as 15 or so. If your program uses
  5545. expanded memory and the EMS driver is one of the older versions,
  5546. you may want to make sure that enough handles are available.
  5547. This routine tells you how many handles are in use.
  5548.  
  5549. Note that this routine expects an EMS driver to be installed. If
  5550. you can't be sure of that, use GetLIMM first to avoid an
  5551. unpleasant surprise.
  5552.  
  5553.    GetLIMHandles Handles%
  5554.  
  5555. -------
  5556. Handles%  number of EMS handles in use
  5557.  
  5558. Name  : GetLIMM              (Get L/I/M expanded Memory)
  5559. Class : Memory / Equipment
  5560. Level : DOS
  5561.  
  5562. This routine tells you how much expanded memory is installed. If
  5563. there is none, or if the EMS driver hasn't been installed, it
  5564. returns zeroes. You should use this routine before any other of
  5565. the PBClone routines that access expanded memory, since the
  5566. other routines expect EMS to be available.
  5567.  
  5568. The results are returned in terms of EMS pages. Each page is 16
  5569. kilobytes.
  5570.  
  5571.    GetLIMM TotalPages%, FreePages%
  5572.  
  5573. -------
  5574. TotalPages%  number of EMS pages installed
  5575. FreePages%   number of EMS pages available for use
  5576.  
  5577. Name  : GetLIMV              (Get L/I/M expanded mem Version)
  5578. Class : Memory / Equipment
  5579. Level : DOS
  5580.  
  5581. The GetLIMV routine tells you the version of EMS driver that is
  5582. being used. The version number is separated into major and minor
  5583. parts. For example, an EMS 3.1 driver would return a major
  5584. number of 3 and minor number of 1.
  5585.  
  5586. Note that this routine expects an EMS driver to be installed. If
  5587. you can't be sure of that, use GetLIMM first to avoid an
  5588. unpleasant surprise.
  5589.  
  5590.    GetLIMV MajorVer%, MinorVer%
  5591.  
  5592. -------
  5593. MajorVer%  major part of the EMS version number
  5594. MinorVer%  minor part of the EMS version number
  5595.  
  5596. Name  : GetLine              (Get Line of text)
  5597. Class : Display
  5598. Level : Any
  5599.  
  5600. This routine retrieves a row of text from a saved (or virtual)
  5601. screen.
  5602.  
  5603. You can use GetLine with a saved screen of any size. The St$
  5604. parameter must be initialized to the width of the saved screen
  5605. (in columns).
  5606.  
  5607. See also ReadScreen, which allows you to read a string of any
  5608. length directly from the display.
  5609.  
  5610.    St$ = SPACE$(ScrWidth%)   ' init to v. screen width
  5611.    GetLine DSeg%, DOfs%, Row%, St$, SLen%
  5612.    St$ = LEFT$(St$, SLen%)
  5613.  
  5614. DSeg%      segment of saved screen
  5615. DOfs%      offset of saved screen
  5616. Row%       row of saved screen (starting at 1)
  5617. -------
  5618. St$        text at given row (init to width of saved screen)
  5619. SLen       logical length of text
  5620.  
  5621. Name  : GetLogiDrive$        (Get Logical Drive)
  5622. Class : Disk
  5623. Level : DOS 3.2+
  5624.  
  5625. This routine is useful for systems which only have a single
  5626. floppy drive. In such cases, DOS connects both drive letters A:
  5627. and B: to the same drive. However, only one drive letter is
  5628. active, and when you try to access the "other" drive, DOS
  5629. displays the message:
  5630.  
  5631.   "Insert diskette for drive x: and press any key when ready."
  5632.  
  5633. This function allows you to determine whether a drive is
  5634. remapped, and if so, which letter is currently active for the
  5635. drive in question. The result will be a null string ("") if the
  5636. drive is not multiply mapped; or, if the drive is multiply
  5637. mapped, the letter which currently refers to the drive is
  5638. returned. For example, if you check drive "A" on a dual-floppy
  5639. system, you'll get back ""; but on a single-floppy system,
  5640. you'll get back "A" or "B", depending on which letter was last
  5641. used to access the drive.
  5642.  
  5643. See also SetLogiDrive, which allows you to set the active drive
  5644. letter for a given drive.
  5645.  
  5646.    ActiveDrv$ = GetLogiDrive$(Drive$)
  5647.  
  5648. Drive$       drive letter to check (use "" for current drive)
  5649. -------
  5650. ActiveDrv$   active drive letter, or "" if no remapping is done
  5651.  
  5652. Name  : GetMemBox            (Get Memory Box info)
  5653. Class : Memory
  5654. Level : DOS
  5655.  
  5656. The PBClone library comes with a TSR called MEMBOX.COM. This TSR
  5657. reserves an area of memory which can be used as a transfer area
  5658. for communication between multiple programs-- the data remains
  5659. as long as the TSR is installed.
  5660.  
  5661. The GetMemBox routine tells you whether MEMBOX is installed, how
  5662. much memory it has, and the location of that memory. You can
  5663. access the MEMBOX memory using any PBClone routine that accepts
  5664. segment and offset pointers. The DGetSt and DPutSt routines will
  5665. probably be most helpful for general use.
  5666.  
  5667. NOTE that MEMBOX expects to be the last TSR installed. If any
  5668. other TSR or program alters the INT 2Fh interrupt vector while
  5669. MEMBOX is active, the results are liable to be messy at best.
  5670.  
  5671.    GetMemLoc DSeg%, DOfs%, Bytes%
  5672.  
  5673. -------
  5674. DSeg%      memory segment
  5675. DOfs%      memory offset
  5676. Bytes%     bytes available (0 if MEMBOX is not installed)
  5677.  
  5678. Name  : GetMouseLoc          (Get Mouse Location)
  5679. Class : Mouse
  5680. Level : BIOS
  5681.  
  5682. This routine allows you to get the current location of the mouse
  5683. cursor. It doesn't matter if the cursor is visible or invisible.
  5684. GetMouseLoc is only for use in text mode.
  5685.  
  5686. This routine will not work properly if there is no mouse
  5687. available. Use the MMCheck routine if you are not sure.
  5688.  
  5689. See also MMGetLoc, which returns the coordinates for graphics
  5690. mode.
  5691.  
  5692.    GetMouseLoc Row%, Column%
  5693.  
  5694. -------
  5695. Row%       mouse cursor row
  5696. Column%    mouse cursor column
  5697.  
  5698. Name  : GetMouseVer          (Get Mouse driver Version)
  5699. Class : Mouse
  5700. Level : BIOS
  5701.  
  5702. This routine retrieves various information about the mouse,
  5703. including the driver version number, mouse type, and IRQ used by
  5704. the mouse.
  5705.  
  5706. Note that this is among the mouse routines that makes you wonder
  5707. what Microsoft was thinking when they designed the mouse driver.
  5708. The mouse driver has no provision for error codes and the "get
  5709. version" function was added comparatively recently, so there is
  5710. no way of knowing with certainty whether this routine worked or
  5711. what the mouse driver version is. If that could be a problem,
  5712. you can reduce the risk by checking the returned values to make
  5713. sure they appear reasonable.
  5714.  
  5715. This routine will not work properly if there is no mouse
  5716. available. Use the MMCheck routine if you are not sure.
  5717.  
  5718. The mouse type may be any of the following:
  5719.    1   bus mouse
  5720.    2   serial mouse
  5721.    3   InPort mouse
  5722.    4   PS/2 mouse
  5723.    5   Hewlett-Packard mouse
  5724.  
  5725. The IRQ will be 0 on the PS/2. Otherwise, it will be 2-5 or 7 on
  5726. Microsoft mice. A mouse designed to take advantage of the AT
  5727. interrupt controller may use higher IRQs (to perhaps 15, I'm not
  5728. sure), so be generous if you do range checking here.
  5729.  
  5730. The version number is divided into two parts. For instance,
  5731. mouse driver 8.20 would return a major version number of 8 and a
  5732. minor version number of 20.
  5733.  
  5734.    GetMouseVer MajorV%, MinorV%, MType%, IRQ%
  5735.  
  5736. -------
  5737. MajorV%    mouse driver major version number
  5738. MinorV%    mouse driver minor version number
  5739. MType%     mouse type
  5740. IRQ%       IRQ used by mouse
  5741.  
  5742. Name  : GetNameA             (Get Name of file in Archive)
  5743. Class : Disk
  5744. Level : DOS
  5745.  
  5746. GetNameA returns the name of an archived file matched by the
  5747. FindFirstA or FindNextA routines. Since some archives may
  5748. include subdirectory specs along with the file name, it is
  5749. recommended that you initialize the return string to 80
  5750. characters (at least 12 are required).
  5751.  
  5752. When parsing filenames which may contain subdirectory specs,
  5753. keep in mind that the forward slash "/" may be used instead of
  5754. the backslash "\" for delimiting subdirectories.
  5755.  
  5756. In order to reach the very widest audience, you may also wish to
  5757. take into account filenames which may have originated on non-PC
  5758. systems. In such filenames, the length of any part of the path
  5759. will not necessarily be restricted to the 11-plus-dot of MS-DOS,
  5760. the dot character may not mean anything special,
  5761. uppercase/lowercase distinctions may be significant, and
  5762. characters may be present which are not valid in MS-DOS names.
  5763.  
  5764. Routines in this series include:
  5765.    FindFirstA, FindNextA, GetNameA, GetCRCA, GetCRCAL,
  5766.    GetDateA, GetTimeA, GetSizeAL, GetStoreA
  5767.  
  5768.    FileName$ = SPACE$(80)
  5769.    GetNameA FileName$, NameLen%
  5770.    FileName$ = LEFT$(FileName$, NameLen%)
  5771.  
  5772. -------
  5773. FileName$   file name (init to >= 12 characters, preferably 80)
  5774. NameLen%    length of file name
  5775.  
  5776. Name  : GetNameF             (Get Name of File)
  5777. Class : Disk
  5778. Level : DOS
  5779.  
  5780. The GetNameF routine returns the name of a file matched by
  5781. FindFirstF or FindNextF. The name will not contain a drive or
  5782. subdirectory specification.
  5783.  
  5784. Routines in this series include:
  5785.    FindFirstF, FindNextF, GetNameF, GetAttrF, GetDateF,
  5786.    GetTimeF, GetSizeFL
  5787.  
  5788.    FileName$ = SPACE$(12)
  5789.    GetNameF FileName$, NameLen%
  5790.    FileName$ = LEFT$(FileName$, NameLen%)
  5791.  
  5792. -------
  5793. FileName$   file name (init to at least 12 characters)
  5794. NameLen%    length of file name
  5795.  
  5796. Name  : GetNameFx$           (Get Name of File, Extended)
  5797. Class : Disk
  5798. Level : DOS
  5799.  
  5800. The GetNameFx$ function returns the name of a file matched by
  5801. FindFirstFx or FindNextFx. The name will not contain a drive or
  5802. subdirectory specification.
  5803.  
  5804. Routines in this series include:
  5805.    FindFirstFx, FindNextFx, GetNameFx$, GetAttrFx%, GetDateFx$,
  5806.    GetTimeFx$, GetSizeFx&
  5807.  
  5808.    FileName$ = GetNameFx$(Buffer$)
  5809.  
  5810. Buffer$       buffer used in search
  5811. -------
  5812. FileName$     file name
  5813.  
  5814. Name  : GetPath$             (Get default Path)
  5815. Class : Disk
  5816. Level : DOS
  5817.  
  5818. This function returns the current drive and subdirectory as an
  5819. absolute path specification.
  5820.  
  5821. See also GetDrv, GetDrive$, GetSub, GetSub1, and GetSub2$.
  5822.  
  5823.    Path$ = GetPath$
  5824.  
  5825. -------
  5826. Path$      name of the current drive and subdirectory
  5827.  
  5828. Name  : GetPrtAddr           (Get Printer Address)
  5829. Class : Printer
  5830. Level : Clone
  5831.  
  5832. This routine allows you to determine the base port address of a
  5833. parallel port. You tell it the LPT port number (1-4) and it
  5834. returns the port address. If there is no port installed, zero
  5835. will be returned.
  5836.  
  5837. Note that up to four printer ports are (theoretically) supported
  5838. on most machines. On PS/2 computers, only three ports are
  5839. allowed, and the fourth port data area is used for other
  5840. purposes. So, it would probably be a good idea to restrict your
  5841. program to ports 1-3.
  5842.  
  5843. Aside from purely informational purposes, this routine can be
  5844. useful in conjunction with SetPrtAddr in manipulating the
  5845. parallel ports.
  5846.  
  5847.    GetPrtAddr PortNr%, PortAddr%
  5848.  
  5849. PortNr%     LPT port number (1-4 or 1-3 [see above])
  5850. -------
  5851. PortAddr%   port address
  5852.  
  5853. Name  : GetPrtSc%            (Get PrtSc press)
  5854. Class : Input
  5855. Level : BIOS
  5856.  
  5857. This function only works when the "print screen" key is
  5858. disabled, which you can accomplish via the PrtSc routine. It
  5859. returns whether the print screen key was pressed since you last
  5860. checked. Like INKEY$, it clears the value after you read it.
  5861.  
  5862.    Pressed% = GetPrtSc%
  5863.  
  5864. -------
  5865. Pressed%    whether the print screen key was pressed (0 if no)
  5866.  
  5867. Name  : GetPSP%              (Get Program Segment Prefix)
  5868. Class : Memory
  5869. Level : DOS
  5870.  
  5871. This function returns the segment of the Program Segment Prefix,
  5872. which is a sort of header at the beginning of every program that
  5873. contains assorted information. You can find out more about the
  5874. PSP in any DOS technical reference.
  5875.  
  5876.    PSeg% = GetPSP%
  5877.  
  5878. -------
  5879. PSeg%      segment of the Program Segment Prefix
  5880.  
  5881. Name  : GetRows              (Get Rows on screen)
  5882. Class : Display
  5883. Level : Clone
  5884.  
  5885. This routine tells you how many rows are on the display. This is
  5886. normally 25, but it may be greater on an EGA or VGA. Only text
  5887. modes are supported.
  5888.  
  5889.    GetRows Rows%
  5890.  
  5891. -------
  5892. Rows%    text rows on the display
  5893.  
  5894. Name  : GetRows2%            (Get Rows on screen)
  5895. Class : Display
  5896. Level : Clone
  5897.  
  5898. This routine tells you how many rows are on the display. This is
  5899. normally 25, but it may be greater on an EGA or VGA. Only text
  5900. modes are supported.
  5901.  
  5902.    Rows% = GetRows2%
  5903.  
  5904. -------
  5905. Rows%    text rows on the display
  5906.  
  5907. Name  : GetScreen            (Get Screen)
  5908. Class : Display
  5909. Level : Clone
  5910.  
  5911. This routine saves any portion of the display to an array. Only
  5912. text modes are supported. If your program uses multiple display
  5913. pages, you can get an image from any of those pages. A special
  5914. "slow" mode is supported for the CGA, to prevent flickering (a
  5915. problem only with some CGAs).
  5916.  
  5917. The size of the integer array needed to store a specific area of
  5918. the screen can be calculated using the CalcSize routine (see).
  5919.  
  5920. If you wish to save the entire screen, you may find ScrSave
  5921. easier (see).
  5922.  
  5923.    GetScreen Array%(), TRow%, LCol%, BRow%, RCol%, Page%, Fast%
  5924.  
  5925. TRow%      top row of the desired screen area
  5926. LCol%      left column of the desired screen area
  5927. BRow%      bottom row of the desired screen area
  5928. RCol%      right column of the desired screen area
  5929. Page%      page from which to get the display area
  5930. Fast%      whether to use fast mode (0 no)
  5931. -------
  5932. Array%()   stored image of the selected area of the screen
  5933.  
  5934. Name  : GetSerial$           (Get disk Serial number)
  5935. Class : Disk
  5936. Level : DOS 4.0+
  5937.  
  5938. The GetSerial function returns the serial number of the
  5939. specified disk. If there is no serial number, it returns
  5940. "0000-0000".
  5941.  
  5942.    SerialNr$ = GetSerial$(Drive$)
  5943.  
  5944. Drive$       drive to get serial # from ("" for current drive)
  5945. -------
  5946. SerialNr$    serial number of the specified drive
  5947.  
  5948. Name  : GetSizeAL            (Get Size of file in Archive Long)
  5949. Class : Disk
  5950. Level : DOS
  5951.  
  5952. GetSizeAL returns the size of an archived file matched by the
  5953. FindFirstA or FindNextA routines.
  5954.  
  5955. Routines in this series include:
  5956.    FindFirstA, FindNextA, GetNameA, GetCRCA, GetCRCAL,
  5957.    GetDateA, GetTimeA, GetSizeAL, GetStoreA
  5958.  
  5959.    GetSizeAL OrigSize&, CurrSize&
  5960.  
  5961. -------
  5962. OrigSize&    original (uncompressed) file size
  5963. CurrSize&    current (compressed) file size
  5964.  
  5965. Name  : GetSizeFL            (Get Size of File as Long)
  5966. Class : Disk
  5967. Level : DOS
  5968.  
  5969. The GetSizeFL routine returns the size of a file matched by
  5970. FindFirstF or FindNextF.
  5971.  
  5972. Routines in this series include:
  5973.    FindFirstF, FindNextF, GetNameF, GetAttrF, GetDateF,
  5974.    GetTimeF, GetSizeFL
  5975.  
  5976.    GetSizeFL FileSize&
  5977.  
  5978. -------
  5979. FileSize&   file size
  5980.  
  5981. Name  : GetSizeFx&           (Get Size of File, Extended)
  5982. Class : Disk
  5983. Level : DOS
  5984.  
  5985. The GetSizeFx& function returns the size of a file matched by
  5986. FindFirstFx or FindNextFx.
  5987.  
  5988. Routines in this series include:
  5989.    FindFirstFx, FindNextFx, GetNameFx$, GetAttrFx%, GetDateFx$,
  5990.    GetTimeFx$, GetSizeFx&
  5991.  
  5992.    FileSize& = GetSizeFx&(Buffer$)
  5993.  
  5994. Buffer$     buffer used in search
  5995. -------
  5996. FileSize&   file size
  5997.  
  5998. Name  : GetStoreA            (Get Storage of file in Archive)
  5999. Class : Disk / Time
  6000. Level : DOS
  6001.  
  6002. GetStoreA returns the method used to compress an archived file
  6003. matched by the FindFirstA or FindNextA routines.
  6004.  
  6005. Routines in this series include:
  6006.    FindFirstA, FindNextA, GetNameA, GetCRCA, GetCRCAL,
  6007.    GetDateA, GetTimeA, GetSizeAL, GetStoreA
  6008.  
  6009.    Storage$ = SPACE$(8)
  6010.    GetStoreA Storage$
  6011.  
  6012. -------
  6013. Storage$    storage method (init to 8 characters)
  6014.  
  6015. Name  : GetSub               (Get default Subdirectory)
  6016. Class : Disk
  6017. Level : DOS
  6018.  
  6019. The GetSub routine gets the current subdirectory on the default
  6020. drive. It does not put a backslash at the start of the
  6021. subdirectory, so you should add this yourself.
  6022.  
  6023. See also GetPath$, GetSub1, and GetSub2$.
  6024.  
  6025.    SubDir$ = SPACE$(64)
  6026.    GetSub SubDir$, SubLen%
  6027.    SubDir$ = "\" + LEFT$(SubDir$, SubLen%)
  6028.  
  6029. -------
  6030. SubDir$    name of the current subdirectory. Init to 64+ chars
  6031. SubLen%    length of the subdirectory name
  6032.  
  6033. Name  : GetSub1              (Get default Subdirectory)
  6034. Class : Disk
  6035. Level : DOS
  6036.  
  6037. The GetSub1 routine gets the current subdirectory on a specified
  6038. drive. Unlike GetSub, it places a backslash at the start of the
  6039. name. It also returns an error code, which allows you to see if
  6040. there was a disk error.
  6041.  
  6042. See also GetPath$, GetSub, and GetSub2$.
  6043.  
  6044.    SubDir$ = SPACE$(65)
  6045.    GetSub1 Drive$, SubDir$, SubLen%, ErrCode%
  6046.    SubDir$ = LEFT$(SubDir$, SubLen%)
  6047.  
  6048. Drive$     letter of the drive to check
  6049. -------
  6050. SubDir$    name of the current subdirectory. Init to 65+ chars
  6051. SubLen%    length of the subdirectory name
  6052. ErrCode%   error code: 0 if no error, else DOS Error
  6053.  
  6054. Name  : GetSub2$             (Get default Subdirectory)
  6055. Class : Disk
  6056. Level : DOS
  6057.  
  6058. The GetSub2 routine gets the current subdirectory on a specified
  6059. drive. Unlike GetSub, it places a backslash at the start of the
  6060. name.
  6061.  
  6062. See also GetPath$, GetSub, and GetSub1.
  6063.  
  6064. If you just want the subdirectory of the current drive, you can
  6065. use a null string ("") as the drive letter, or use GetPath$.
  6066.  
  6067.    SubDir$ = GetSub2$(Drive$)
  6068.  
  6069. Drive$     letter of the drive to check
  6070. -------
  6071. SubDir$    name of the current subdirectory. Init to 65+ chars
  6072.  
  6073. Name  : GetSwitch            (Get Switch character)
  6074. Class : Miscellaneous
  6075. Level : DOS
  6076.  
  6077. An undocumented capability in many DOS versions allows you to
  6078. set the DOS "switch character", which is the delimiter used to
  6079. identify a switch on the DOS command line. This is normally a
  6080. slash, as in "DIR /W". However, many people prefer to change it
  6081. to a "-", which is the switch character used by Unix.
  6082.  
  6083. With the normal "/" delimiter, a backslash "\" is used in
  6084. subdirectory specifications. DOS itself will recognize either
  6085. one as a subdirectory delimiter, but the command line won't
  6086. unless the switch char was changed.
  6087.  
  6088. The upshot of all this is, whereas you might normally use a
  6089. command like:
  6090.    DIR /W C:\GAMES
  6091.  
  6092. Someone with a different switch character might use something
  6093. like this:
  6094.    DIR -W C:/GAMES
  6095.  
  6096. This is exactly the sort of syntax that Unix commands use.
  6097.  
  6098. If you design your program to recognize the different
  6099. delimiters, you will make some people very happy! The GetSwitch
  6100. routine will detect changed delimiters on those versions of DOS
  6101. which support it, and will return an ordinary "/" on those
  6102. versions of DOS which don't.
  6103.  
  6104.    Switch$ = "x"
  6105.    GetSwitch Switch$
  6106.  
  6107. -------
  6108. Switch$    the DOS switch character.  Init to one character.
  6109.  
  6110. Name  : GetSwitch2$          (Get Switch character)
  6111. Class : Miscellaneous
  6112. Level : DOS
  6113.  
  6114. This does exactly the same thing as the GetSwitch routine, but
  6115. it is a FUNCTION rather than a SUB. For more information, see
  6116. GetSwitch.
  6117.  
  6118.    Switch$ = GetSwitch2$
  6119.  
  6120. -------
  6121. Switch$    the DOS switch character
  6122.  
  6123. Name  : GetTick&             (Get Tick)
  6124. Class : Time
  6125. Level : Clone
  6126.  
  6127. This function returns the system time. This value represents the
  6128. time after midnight. There are about 18.2 ticks per second,
  6129. providing sufficiently fine resolution for most purposes.
  6130.  
  6131. If you use this function as part of a delay loop, keep in mind
  6132. that the value will wrap around at midnight, and that any given
  6133. value may be "skipped" due to causes beyond your control--
  6134. multitasking or background operations such as communications or
  6135. print spooling, for example. So, DO NOT check for a specific
  6136. "end time"-- it may never come! Instead, decrement a counter
  6137. whenever you notice that the time has changed since you last
  6138. checked. This disassociates the delay from a specific time,
  6139. preventing lockups.
  6140.  
  6141.    Tick& = GetTick&
  6142.  
  6143. -------
  6144. Tick&        time after midnight (1/18.2 seconds)
  6145.  
  6146. Name  : GetTime              (Get Time)
  6147. Class : Time
  6148. Level : DOS
  6149.  
  6150. This routine tells you the time according to DOS.
  6151.  
  6152. The main difference between getting the time from BASIC and
  6153. getting it from DOS is the "hundredths of seconds" value.
  6154. However, this value is not available on some machines, in which
  6155. case it will be set to zero. It is not accurate on most
  6156. machines, being calculated instead using a semi-random approach;
  6157. it is more of a novelty than a useful value.
  6158.  
  6159.    GetTime HourNr%, MinuteNr%, SecondNr%, Hundredth%
  6160.  
  6161. -------
  6162. HourNr%      hour (0-23)
  6163. MinuteNr%    minute
  6164. SecondNr%    second
  6165. Hundredth%   hundredth of a second.  See remarks, above.
  6166.  
  6167. Name  : GetTimeA             (Get Time of file in Archive)
  6168. Class : Disk / Time
  6169. Level : DOS
  6170.  
  6171. GetTimeA returns the time of an archived file matched by the
  6172. FindFirstA or FindNextA routines.
  6173.  
  6174. Routines in this series include:
  6175.    FindFirstA, FindNextA, GetNameA, GetCRCA, GetCRCAL,
  6176.    GetDateA, GetTimeA, GetSizeAL, GetStoreA
  6177.  
  6178.    GetTimeA HourNr%, MinuteNr%, SecondNr%
  6179.  
  6180. -------
  6181. HourNr%     hour
  6182. MinuteNr%   minute
  6183. SecondNr%   second
  6184.  
  6185. Name  : GetTimeAT            (Get Time from AT clock)
  6186. Class : Time
  6187. Level : BIOS (AT)
  6188.  
  6189. This routine gets the time from the hardware real-time clock in
  6190. AT-class computers. Depending on the DOS version, this time may
  6191. be partially or completely independent of the time kept by DOS
  6192. in software. DOS always reads the time from the hardware clock
  6193. when it starts up. However, use of the TIME command in DOS (and
  6194. the TIME$ function in QuickBASIC) may relate only to the
  6195. software copy of the time, which is not always guaranteed to be
  6196. the same as the time in the hardware clock due to certain
  6197. discrepancies in DOS.
  6198.  
  6199.    GetTimeAT HourNr%, MinuteNr%, SecondNr%, ErrCode%
  6200.  
  6201. -------
  6202. HourNr%      hour (0-23)
  6203. MinuteNr%    minute
  6204. SecondNr%    second
  6205. ErrCode%     error code: 0 if no error, else clock has stopped
  6206.  
  6207. Name  : GetTimeF             (Get Time of File)
  6208. Class : Disk / Time
  6209. Level : DOS
  6210.  
  6211. The GetTimeF routine returns the time of a file matched by
  6212. FindFirstF or FindNextF.
  6213.  
  6214. Routines in this series include:
  6215.    FindFirstF, FindNextF, GetNameF, GetAttrF, GetDateF,
  6216.    GetTimeF, GetSizeFL
  6217.  
  6218.    GetTimeF HourNr%, MinuteNr%, SecondNr%
  6219.  
  6220. -------
  6221. HourNr%     hour
  6222. MinuteNr%   minute
  6223. SecondNr%   second
  6224.  
  6225. Name  : GetTimeFx$           (Get Time of File, Extended)
  6226. Class : Disk / Time
  6227. Level : DOS
  6228.  
  6229. The GetTimeFx$ function returns the time of a file matched by
  6230. FindFirstFx or FindNextFx.
  6231.  
  6232. Routines in this series include:
  6233.    FindFirstFx, FindNextFx, GetNameFx$, GetAttrFx%, GetDateFx$,
  6234.    GetTimeFx$, GetSizeFx&
  6235.  
  6236.    FileTime$ = GetTimeFx$(Buffer$)
  6237.  
  6238. Buffer$      buffer used in search
  6239. -------
  6240. FileTime$    file time (e.g., "17:53:20")
  6241.  
  6242. Name  : GetTView             (Get TopView)
  6243. Class : Miscellaneous
  6244. Level : BIOS
  6245.  
  6246. This routine tells you whether TopView or a compatible
  6247. multitasker (such as TaskView or DESQview) is loaded.
  6248.  
  6249. See also GetDView, GetTVScreen, UpdTVScreen.
  6250.  
  6251.    GetTView Installed%
  6252.  
  6253. -------
  6254. Installed%   whether a TopView-type multitasker is loaded
  6255.  
  6256. Name  : GetTVScreen          (Get TopView Screen address)
  6257. Class : Display / Miscellaneous
  6258. Level : BIOS
  6259.  
  6260. GetTVScreen returns the address of the screen buffer used by a
  6261. TopView-type multitasker. This allows you to use direct screen
  6262. access while remaining within the windows allocated to your
  6263. program by the multitasker.
  6264.  
  6265. You must tell the multitasker the address of the screen you
  6266. would be writing to if the multitasker was not installed.
  6267. Specify a segment of &HB000 if using an MDA or Hercules, or a
  6268. segment of &HB800 for CGA, EGA, MCGA or VGA. The offset should
  6269. always be 0. This is for use in text modes.
  6270.  
  6271. The routine will return with the new segment and offset for you
  6272. to use. These values can be used with any PBClone screen routine
  6273. that accepts a segment and offset-- DQPrint and DXQPrint, for
  6274. example.
  6275.  
  6276. Note that not all TopView-compatible multitaskers will
  6277. automatically update the screen from the buffer. The UpdTVScreen
  6278. routine allows you to force a screen update.
  6279.  
  6280. See also GetDView, GetTView, UpdTVScreen.
  6281.  
  6282.    GetTVScreen DSeg%, DOfs%
  6283.  
  6284. DSeg%       segment of desired screen
  6285. DOfs%       offset of desired screen
  6286. -------
  6287. DSeg%       segment of screen buffer
  6288. DOfs%       offset of screen buffer
  6289.  
  6290. Name  : GetValidKey          (Get Valid Key)
  6291. Class : Input
  6292. Level : DOS
  6293.  
  6294. This one is useful for getting one of a list of keys from the
  6295. keyboard. You give it a list of keys (letters should be
  6296. uppercase) to accept. It will wait until one of the listed keys
  6297. is pressed; for letters, it will accept either lowercase or
  6298. uppercase keys, but will convert the letter to uppercase before
  6299. it returns to you. If you pass it a blank list, it will accept
  6300. any key.
  6301.  
  6302. The Result$ string needs to be initialized to one character
  6303. before you call the routine, due to limitations on what assembly
  6304. language routines are allowed to do with BASIC strings.
  6305.  
  6306. This routine is handy for when you want to allow one of a list
  6307. of choices from a menu, for instance.
  6308.  
  6309.    Result$ = "x"
  6310.    GetValidKey GoodList$, Result$
  6311.  
  6312. GoodList$    list of acceptable keys.  See above for remarks.
  6313. -------
  6314. Result$      the key that was accepted (uppercase if letter)
  6315.  
  6316. Name  : GetVerify            (Get Verify setting)
  6317. Class : Disk
  6318. Level : DOS
  6319.  
  6320. The GetVerify routine tells you the state of the DOS VERIFY
  6321. flag. When VERIFY is on, some checking is done to make sure that
  6322. writing to the disk works as requested. The checks are not very
  6323. good, however, and VERIFY slows down disk handling, so it is
  6324. usually better to have VERIFY off.
  6325.  
  6326. You can change the state of VERIFY by using the DOS VERIFY
  6327. command or with the SetVerify routine in PBClone.
  6328.  
  6329.    GetVerify VerifyOn%
  6330.  
  6331. -------
  6332. VerifyOn%   whether VERIFY is on (0 if no)
  6333.  
  6334. Name  : GetVGA               (Get VGA information)
  6335. Class : Display / Equipment
  6336. Level : BIOS
  6337.  
  6338. This routine tells you whether a VGA is available.
  6339.  
  6340. See also GetCRT, GetEGA and GetHGA.
  6341.  
  6342.    GetVGA IsVGA%
  6343.  
  6344. -------
  6345. IsVGA%    whether a VGA is installed (0 if no)
  6346.  
  6347. Name  : GetVGA2%             (Get VGA information)
  6348. Class : Display / Equipment
  6349. Level : BIOS
  6350.  
  6351. This routine tells you whether a VGA is available.
  6352.  
  6353. See also GetCRT, GetEGA and GetHGA.
  6354.  
  6355.    IsVGA% = GetVGA2%
  6356.  
  6357. -------
  6358. IsVGA%    whether a VGA is installed (0 if no)
  6359.  
  6360. Name  : GetVGAColor          (Get VGA Color)
  6361. Class : Display
  6362. Level : BIOS
  6363.  
  6364. This routine gets the components of a single VGA palette color.
  6365. It returns the color value associated with a given color number.
  6366.  
  6367. If you are dealing with more than one color at a time, you may
  6368. find GetVGAPalette more appropriate.
  6369.  
  6370.    GetVGAColor ColorNr%, Red%, Green%, Blue%
  6371.  
  6372. ColorNr%   color number (1-16 or 1-255, depending on VGA mode)
  6373. -------
  6374. Red%       red intensity (0-63)
  6375. Green%     green intensity (0-63)
  6376. Blue%      blue intensity (0-63)
  6377.  
  6378. Name  : GetVGAPalette        (Get VGA Palette)
  6379. Class : Display
  6380. Level : BIOS
  6381.  
  6382. This routine allows you to get any number of the VGA palette
  6383. settings into a TYPEd array. The TYPE for the array should be
  6384. defined like this:
  6385.  
  6386.    TYPE Palet
  6387.       IRed AS STRING * 1
  6388.       IBlue AS STRING * 1
  6389.       IGreen AS STRING * 1
  6390.    END TYPE
  6391.  
  6392. This type holds a CHR$-encoded representation of the intensity
  6393. of each component of the color. The values range from 0-63.
  6394.  
  6395. If you are only dealing with a few colors, you may find it more
  6396. convenient to use GetVGAColor instead.
  6397.  
  6398.    GetVGAPalette DSeg%, DOfs%, Start%, Colors%
  6399.  
  6400. DSeg%      segment of the palette array
  6401. DOfs%      offset of the palette array
  6402. Start%     color number to start with
  6403. Colors%    number of colors to get
  6404.  
  6405. Name  : GetVidMode           (Get Video Mode)
  6406. Class : Display
  6407. Level : BIOS
  6408.  
  6409. The GetVidMode routine tells you about the current display
  6410. status from the BIOS' point of view. Note that the BIOS display
  6411. mode is not the same as the BASIC SCREEN mode (a direct
  6412. translation between the two is messy, because BASIC
  6413. conglomerates several BIOS modes into a single SCREEN mode in
  6414. several instances).
  6415.  
  6416.    GetVidMode BIOSMode%, ScreenWidth%, ActivePage%
  6417.  
  6418. -------
  6419. BIOSMode%     BIOS video mode
  6420. ScreenWidth%  number of columns per row
  6421. ActivePage%   active (visible) display page
  6422.  
  6423. Name  : GetXMSm              (Get XMS Memory)
  6424. Class : Memory / Equipment
  6425. Level : DOS
  6426.  
  6427. This routine tells you how much XMS memory is available. If
  6428. there is none, or if the XMS driver hasn't been installed, it
  6429. returns zeroes. Memory is returned kilobytes.
  6430.  
  6431.    GetXMSm LargestFree&, TotalFree&
  6432.  
  6433. -------
  6434. LargestFree&  largest free block of XMS memory
  6435. TotalFree&    total free XMS memory
  6436.  
  6437. Name  : GetXMSv              (Get XMS Version)
  6438. Class : Memory / Equipment
  6439. Level : BIOS
  6440.  
  6441. The GetXMSv routine tells you the version of XMS driver that is
  6442. being used. The version number is separated into major and minor
  6443. parts. For example, an XMS 2.0 driver would return a major
  6444. number of 2 and minor number of 0.
  6445.  
  6446.    GetXMSv MajorVer%, MinorVer%
  6447.  
  6448. -------
  6449. MajorVer%  major part of the XMS version number
  6450. MinorVer%  minor part of the XMS version number
  6451.  
  6452. Name  : GLoad                (Graphics Load)
  6453. Class : Disk
  6454. Level : DOS
  6455.  
  6456. A replacement for the BASIC BLOAD statement, this routine loads
  6457. a binary memory image from a file into the area of memory it
  6458. formerly occupied. This is most often used to restore a screen
  6459. display from a file, although PBClone offers more flexible
  6460. alternatives.
  6461.  
  6462.    GLoad FileName$
  6463.  
  6464. FileName$    name of the file to load into memory
  6465.  
  6466. Name  : GQPrint              (Graphics Quick Print)
  6467. Class : Display
  6468. Level : Clone
  6469.  
  6470. This is a simple high-speed replacement for the PRINT statement
  6471. which works in CGA graphics mode (SCREEN 2). It does not
  6472. interpret control codes, support graphics characters (ASCII
  6473. 128-255), or update the cursor position, in return for which it
  6474. is much faster than PRINT.
  6475.  
  6476. The Fast% parameter is ignored at the moment-- top speed is
  6477. always used, which may cause flickering on some CGAs.
  6478.  
  6479.    GQPrint St$, Row%, Column%, Fast%
  6480.  
  6481. St$      string to display
  6482. Row%     row (1-25)
  6483. Column%  column (1-80)
  6484. Fast%    not used
  6485.  
  6486. Name  : GrafPrint            (Graphics Print)
  6487. Class : Display
  6488. Level : Clone
  6489.  
  6490. This is a flexible replacement for the PRINT statement which
  6491. operates in graphics mode. It allows you to display text at
  6492. graphics coordinates instead of text coordinates for better
  6493. alignment with graphs and so forth. It also lets you specify the
  6494. size of the font-- you can stretch it in either vertical or
  6495. horizontal directions, or both, using a font multiplier value.
  6496.  
  6497. The disadvantages of this routine are that it is slower than an
  6498. ordinary PRINT, only does foreground printing (if you need a
  6499. background color, you need to fill that in yourself beforehand),
  6500. won't do automatic wrap or scroll, and won't handle control
  6501. codes or graphics characters (ASCII 0-31, 127-255). The font is
  6502. based on the normal CGA graphics font, which uses an 8x8 grid
  6503. for each character.
  6504.  
  6505. GrafPrint will work in any graphics mode.
  6506.  
  6507.    GrafPrint St$, X%, Y%, High%, Wide%, Colour%
  6508.  
  6509. St$       string to display
  6510. X%        graphics column to start at
  6511. Y%        graphics row to start at
  6512. High%     font height multiplier
  6513. Wide%     font width multiplier
  6514. Colour%   foreground color for string
  6515.  
  6516. Name  : GrafRest             (Graphics Restore)
  6517. Class : Display
  6518. Level : Clone
  6519.  
  6520. This routine allows you to restore a SCREEN 1 (CGA, 320x200, 4
  6521. color) or SCREEN 2 (CGA, 640x200, 2 color) display that was
  6522. saved using GrafSave (see).
  6523.  
  6524.    GrafRest DSeg%, DOfs%
  6525.  
  6526. DSeg%      segment of storage array, returned by VARSEG
  6527. DOfs%      offset  of storage array, returned by VARPTR
  6528.  
  6529. Name  : GrafSave             (Graphics Save)
  6530. Class : Display
  6531. Level : Clone
  6532.  
  6533. This routine allows you to save a SCREEN 1 (CGA, 320x200, 4
  6534. color) or SCREEN 2 (CGA, 640x200, 2 color) display that can be
  6535. restored using GrafRest (see).
  6536.  
  6537. The array used to hold the screen must contain 16,000 bytes. For
  6538. an integer array, this means that you must create the array by
  6539. DIM Array%(1 TO 8000).
  6540.  
  6541.    GrafSave DSeg%, DOfs%
  6542.  
  6543. DSeg%      segment of storage array, returned by VARSEG
  6544. DOfs%      offset  of storage array, returned by VARPTR
  6545.  
  6546. Name  : GXQPrint             (Graphics Extended Quick Print)
  6547. Class : Display
  6548. Level : Clone
  6549.  
  6550. This is a simple high-speed replacement for the PRINT statement
  6551. which works in CGA graphics mode (SCREEN 1). It does not
  6552. interpret control codes, support graphics characters (ASCII
  6553. 128-255), or update the cursor position, in return for which it
  6554. is much faster than PRINT.
  6555.  
  6556. This routine can also be used in SCREEN 2, where it will display
  6557. the string in shades instead of in color (using 40 columns/row).
  6558.  
  6559. The Fast% parameter is ignored at the moment-- top speed is
  6560. always used, which may cause flickering on some CGAs.
  6561.  
  6562. The results of this routine are not redirectable by DOS.
  6563.  
  6564.    GXQPrint St$, Row%, Column%, Fore%, Fast%
  6565.  
  6566. St$      string to display
  6567. Row%     row (1-25)
  6568. Column%  column (1-40)
  6569. Fore%    foreground color (0-3)
  6570. Fast%    not used
  6571.  
  6572. Name  : GXQPrint1            (Graphics Extended Quick Print)
  6573. Class : Display
  6574. Level : Clone
  6575.  
  6576. This is a high-speed replacement for the PRINT statement which
  6577. works in CGA graphics mode (SCREEN 1). It does not interpret
  6578. control codes or update the cursor position, in return for which
  6579. it is much faster than PRINT.
  6580.  
  6581. This routine can also be used in SCREEN 2, where it will display
  6582. the string in shades instead of in color (using 40 columns/row).
  6583.  
  6584. The Fast% parameter is ignored at the moment-- top speed is
  6585. always used, which may cause flickering on some CGAs.
  6586.  
  6587. The results of this routine are not redirectable by DOS.
  6588.  
  6589.    GXQPrint1 St$, Row%, Column%, Fore%, Back%, Fast%
  6590.  
  6591. St$      string to display
  6592. Row%     row (1-25)
  6593. Column%  column (1-40)
  6594. Fore%    foreground color (0-3)
  6595. Back%    background color (0-3)
  6596. Fast%    not used
  6597.  
  6598. Name  : HandleInfo           (Handle Information)
  6599. Class : Miscellaneous
  6600. Level : DOS
  6601.  
  6602. HandleInfo tells you whether a file handle refers to a file or
  6603. to a device. If the handle does not exist, an error code will be
  6604. returned.
  6605.  
  6606. This is for file handles as returned by FOpen1 and FCreate. It
  6607. can also be used with file numbers associated with OPEN, via a
  6608. BASIC function that was introduced with QuickBASIC 4.0:
  6609.  
  6610.    Handle% = FILEATTR(FileNumber%, 2)
  6611.  
  6612. See FClose1 for a list of predefined handles.
  6613.  
  6614.    HandleInfo Handle%, Device%, ErrCode%
  6615.  
  6616. Handle%    file handle
  6617. -------
  6618. Device%    whether the handle refers to a device (0 no)
  6619. ErrCode%   whether there was an error (0 no)
  6620.  
  6621. Name  : HCls                 (Hercules CLS)
  6622. Class : Display
  6623. Level : Clone
  6624.  
  6625. This routine clears a Hercules graphics screen to the specified
  6626. color.
  6627.  
  6628. Routines in this series are:
  6629.    HCls, HLine, HMode, HPrint, HSetPixel, HTestPixel
  6630.  
  6631.    HCls Colour%
  6632.  
  6633. Colour%    color (0-1)
  6634.  
  6635. Name  : Heads%               (Heads)
  6636. Class : Disk
  6637. Level : DOS 3.3+
  6638.  
  6639. This function returns the number of heads for a given disk
  6640. drive. If the drive does not exist or is not a physical drive,
  6641. -1 will be returned.
  6642.  
  6643. You may use "" to denote the current drive.
  6644.  
  6645.    Hds% = Heads% (Drive$)
  6646.  
  6647. Drive$    drive for which to return cylinders
  6648. -------
  6649. Heads%    number of drive heads (-1 if error)
  6650.  
  6651. Name  : HiByte%              (High Byte)
  6652. Class : Numeric
  6653. Level : Any
  6654.  
  6655. This function returns the high byte of an integer.
  6656.  
  6657.    Byte% = HiByte%(Nr%)
  6658.  
  6659. Nr%        integer
  6660. -------
  6661. Byte%      value of the most significant byte
  6662.  
  6663. Name  : HiLite               (Highlight)
  6664. Class : Display
  6665. Level : Clone
  6666.  
  6667. This routine allows you to highlight text on the screen. It
  6668. works in text modes only and always displays to the visible
  6669. screen page.
  6670.  
  6671. See also ReColorArea, which lets you highlight any rectangular
  6672. area of the screen.
  6673.  
  6674.    HiLite Row%, LCol%, RCol%, VAttr%
  6675.  
  6676. Row%       row on which to highlight
  6677. LCol%      left column (where highlight starts)
  6678. RCol%      right column (where highlight ends)
  6679. VAttr%     new color (see CalcAttr)
  6680.  
  6681. Name  : HiWord%              (High Word)
  6682. Class : Numeric
  6683. Level : Any
  6684.  
  6685. This function returns the high word of a long integer.
  6686.  
  6687.    Word% = HiWord%(Nr&)
  6688.  
  6689. Nr&        long integer
  6690. -------
  6691. Word%      value of the most significant word
  6692.  
  6693. Name  : HLine                (Hercules LINE)
  6694. Class : Display
  6695. Level : Clone
  6696.  
  6697. This routine draws a line on a Hercules graphics screen.
  6698.  
  6699. Routines in this series are:
  6700.    HCls, HLine, HMode, HPrint, HSetPixel, HTestPixel
  6701.  
  6702.    HLine X1%, Y1%, X2%, Y2%, Colour%
  6703.  
  6704. X1%        starting graphics column (0-719)
  6705. Y1%        starting graphics row (0-347)
  6706. X2%        ending graphics column (0-719)
  6707. Y2%        ending graphics row (0-347)
  6708. Colour%    color (0-1)
  6709.  
  6710. Name  : HMode                (Hercules Mode)
  6711. Class : Display
  6712. Level : Clone
  6713.  
  6714. This routine switches between text mode and Hercules graphics
  6715. mode. Use HInit first to initialize the graphics mode
  6716. appropriately.
  6717.  
  6718. HMode will clear page 0 when graphics mode is entered. Page 1,
  6719. if it exists, is not cleared. PBClone does not support page 1 in
  6720. any respect.
  6721.  
  6722. Routines in this series are:
  6723.    HCls, HLine, HMode, HPrint, HSetPixel, HTestPixel
  6724.  
  6725.    HMode Graphics%
  6726.  
  6727. Graphics%    display mode to set (0 text, else graphics)
  6728.  
  6729. Name  : HPrint               (Hercules Print)
  6730. Class : Display
  6731. Level : Clone
  6732.  
  6733. This routine displays text in Hercules graphics mode. It uses
  6734. the full resolution of the screen, so text is 90 columns by 43
  6735. rows. This gives you more space than even the largest EGA text
  6736. mode, which is only 80x43.
  6737.  
  6738. Routines in this series are:
  6739.    HCls, HLine, HMode, HPrint, HSetPixel, HTestPixel
  6740.  
  6741.    HPrint St$, Row%, Column%
  6742.  
  6743. St$        text to display
  6744. Row%       row (1-43)
  6745. Column%    column (1-90)
  6746.  
  6747. Name  : HSetPixel            (Hercules Set Pixel)
  6748. Class : Display
  6749. Level : Clone
  6750.  
  6751. This routine draws a dot on a Hercules graphics screen.
  6752.  
  6753. Routines in this series are:
  6754.    HCls, HLine, HMode, HPrint, HSetPixel, HTestPixel
  6755.  
  6756.    HSetPixel X%, Y%, Colour%
  6757.  
  6758. X%         graphics column (0-719)
  6759. Y%         graphics row (0-347)
  6760. Colour%    color (0-1)
  6761.  
  6762. Name  : HTestPixel           (Hercules Test Pixel)
  6763. Class : Display
  6764. Level : Clone
  6765.  
  6766. This routine returns the color of a dot on a Hercules graphics
  6767. screen.
  6768.  
  6769. Routines in this series are:
  6770.    HCls, HLine, HMode, HPrint, HSetPixel, HTestPixel
  6771.  
  6772.    Colour% = HTestPixel%(X%, Y%)
  6773.  
  6774. X%         graphics column (0-719)
  6775. Y%         graphics row (0-347)
  6776. -------
  6777. Colour%    color (0-1)
  6778.  
  6779. Name  : IdentifyFile         (Identify File)
  6780. Class : Disk
  6781. Level : DOS
  6782.  
  6783. Given a file name, this routine attempts to identify what kind
  6784. of file it is. Most information is derived from the file
  6785. extension, but some files are processed more deeply. For
  6786. instance, a file named "UNKNOWN.BAS" will be checked to see if
  6787. it is source code (tokenized GWBASIC format, tokenized
  6788. QuickBASIC format, or plain ASCII text) or a binary BSAVE/BLOAD
  6789. image (which is further categorized as to whether it is a screen
  6790. image, and if so, for what kind of display).
  6791.  
  6792.    Descript$ = SPACE$(80)
  6793.    IdentifyFile FileName$, Descript$, DescrLen%
  6794.    Descript$ = LEFT$(Descript$, DescrLen%)
  6795.  
  6796. FileName$    name of the file to identify
  6797. -------
  6798. Descript$    description of the file (init to at least 80 chars)
  6799. DescrLen%    length of the description
  6800.  
  6801. Name  : InitPtr              (Initialize Pointers)
  6802. Class : Array management
  6803. Level : Any
  6804.  
  6805. This routine initializes an array of pointers for use with the
  6806. pointer sort routines (PSortD, et al). It may also be useful for
  6807. other purposes. Each element of the array is set equal to its
  6808. index (the first element is set to 1, the second to 2, and so
  6809. forth). Arrays are expected to begin at element 1. You may
  6810. specify the last element to initialize, allowing you to use only
  6811. part of an array.
  6812.  
  6813.    InitPtr Ptr%(), Elements%
  6814.  
  6815. Ptr%()      array to initialize
  6816. Elements%   number of elements to initialize
  6817. -------
  6818. Ptr%()      initialized array
  6819.  
  6820. Name  : InsChr               (Insert Character)
  6821. Class : Display
  6822. Level : Clone
  6823.  
  6824. The InsChr routine inserts a space at the specified screen
  6825. location.
  6826.  
  6827.    InsChr Row%, Column%
  6828.  
  6829. Row%      row of character
  6830. Column%   column of character
  6831.  
  6832. Name  : InsLine              (Insert Line)
  6833. Class : Display
  6834. Level : BIOS
  6835.  
  6836. This routine inserts a blank line at the specified row of the
  6837. screen.
  6838.  
  6839.    InsLine Row%, VAttr%
  6840.  
  6841. Row%      row to insert
  6842. VAttr%    color/attribute to use on new row (see CalcAttr)
  6843.  
  6844. Name  : Int2Date             (Integer to Date)
  6845. Class : Time
  6846. Level : Any
  6847.  
  6848. This routine undoes the results of the Date2Int routine. It
  6849. expands a single integer into month, day, and year values.
  6850.  
  6851. The storage format is identical to that used by DOS for file
  6852. dates, by the way, so this routine makes an apt companion for
  6853. LoadDirAll.
  6854.  
  6855.  
  6856. See also Int2DateSt$, a version of this routine which returns a
  6857. string instead of numbers.
  6858.  
  6859.  
  6860.    Int2Date MonthNr%, DayNr%, YearNr%, IntDate%
  6861.  
  6862. IntDate%     date compressed into an integer
  6863. -------
  6864. MonthNr%     month number (1-12)
  6865. DayNr%       day (1-31)
  6866. YearNr%      year (1980-2079; see above for two-digit years)
  6867.  
  6868. Name  : Int2DateSt$          (Integer to Date String)
  6869. Class : Time
  6870. Level : Any
  6871.  
  6872. This routine undoes the results of the Date2Int routine. It
  6873. expands a single integer into a date string with the format
  6874. MM-DD-YYYY.
  6875.  
  6876. The storage format is identical to that used by DOS for file
  6877. dates, by the way, so this routine makes an apt companion for
  6878. LoadDirAll.
  6879.  
  6880. See also Int2Date, a version of this routine which returns
  6881. month, day, and year numbers instead of a string.
  6882.  
  6883.  
  6884.    DateSt$ = Int2DateSt$(IntDate%)
  6885.  
  6886. IntDate%     date compressed into an integer
  6887. -------
  6888. DateSt$      uncompressed date in MM-DD-YYYY format.
  6889.  
  6890. Name  : Int2Time             (Integer to Time)
  6891. Class : Time
  6892. Level : Any
  6893.  
  6894. This routine undoes the results of the Time2Int routine. It
  6895. expands a single integer into hour, minute, and second values.
  6896.  
  6897. Note that the seconds will always be even, due to the storage
  6898. format. The storage format is identical to that used by DOS for
  6899. file times, by the way, so this routine makes an apt companion
  6900. for LoadDirAll.
  6901.  
  6902. See also Int2TimeSt$, a version of this routine which returns a
  6903. string instead of numbers.
  6904.  
  6905.    Int2Time HourNr%, MinuteNr%, SecondNr%, IntTime%
  6906.  
  6907. IntTime%     time compressed into an integer
  6908. -------
  6909. HourNr%      hour (0-23)
  6910. MinuteNr%    minute
  6911. SecondNr%    second
  6912.  
  6913. Name  : Int2TimeSt$          (Integer to Time String)
  6914. Class : Time
  6915. Level : Any
  6916.  
  6917. This routine undoes the results of the Time2Int routine. It
  6918. expands a single integer into hour, minute, and second values.
  6919.  
  6920. Note that the seconds will always be even, due to the storage
  6921. format. The storage format is identical to that used by DOS for
  6922. file times, by the way, so this routine makes an apt companion
  6923. for LoadDirAll.
  6924.  
  6925. See also Int2Time, a version of this routine which returns hour,
  6926. minute, and second numbers instead of a string.
  6927.  
  6928.    TimeSt$ = Int2TimeSt$(IntTime%)
  6929.  
  6930. IntTime%     time compressed into an integer
  6931. -------
  6932. TimeSt$      uncompressed time in HH:MM:SS format
  6933.  
  6934. Name  : IntVector            (Interrupt Vector)
  6935. Class : Miscellaneous
  6936. Level : DOS
  6937.  
  6938. The IntVector routine retrieves the address of a specified
  6939. interrupt handler. If there is no interrupt handler, the results
  6940. will normally be zero, although early DOS versions did not
  6941. always have the sense to initialize unused vectors that way.
  6942.  
  6943.    IntVector DSeg%, DOfs%, Interrupt%
  6944.  
  6945. Interrupt%   interrupt number to examine
  6946. -------
  6947. DSeg%        segment of the interrupt handler
  6948. DOfs%        offset of the interrupt handler
  6949.  
  6950. Name  : IRead                (Integer Read)
  6951. Class : Disk
  6952. Level : DOS
  6953.  
  6954. This routine reads an integer (two binary bytes) from a file.
  6955. For some applications, you might prefer LIRead, which reads an
  6956. integer from a file into a zero-extended long integer-- which
  6957. essentially provides support for unsigned integers (0-65535).
  6958.  
  6959. The file must have been opened using FCreate or FOpen1.
  6960.  
  6961.    IRead Handle%, Value%, ErrCode%
  6962.  
  6963. Handle%    file handle
  6964. -------
  6965. Value%     integer read from file
  6966. ErrCode%   DOS error code (0 if no error)
  6967.  
  6968. Name  : IsAlNum%             (Is Alphanumeric?)
  6969. Class : String
  6970. Level : Any
  6971.  
  6972. This function returns whether a character is alphabetic or
  6973. numeric.
  6974.  
  6975. Functions in this family include:
  6976.    IsAlNum, IsAlpha, IsASCII, IsCntrl, IsDigit, IsLower,
  6977.    IsPrint, IsPunct, IsSpace, IsUpper, IsXDigit
  6978.  
  6979.    IsIt% = IsAlNum%(Ch$)
  6980.  
  6981. Ch$       character to check
  6982. -------
  6983. IsIt%     -1 if the character is alphabetic or numeric
  6984.  
  6985. Name  : IsAlpha%             (Is Alphabetic?)
  6986. Class : String
  6987. Level : Any
  6988.  
  6989. This function returns whether a character is alphabetic.
  6990.  
  6991. Functions in this family include:
  6992.    IsAlNum, IsAlpha, IsASCII, IsCntrl, IsDigit, IsLower,
  6993.    IsPrint, IsPunct, IsSpace, IsUpper, IsXDigit
  6994.  
  6995.    IsIt% = IsAlpha%(Ch$)
  6996.  
  6997. Ch$       character to check
  6998. -------
  6999. IsIt%     -1 if the character is alphabetic
  7000.  
  7001. Name  : IsASCII%             (Is ASCII?)
  7002. Class : String
  7003. Level : Any
  7004.  
  7005. This function returns whether a character is ASCII. This is true
  7006. if the character ranges from CHR$(0)-CHR$(127).
  7007.  
  7008. Functions in this family include:
  7009.    IsAlNum, IsAlpha, IsASCII, IsCntrl, IsDigit, IsLower,
  7010.    IsPrint, IsPunct, IsSpace, IsUpper, IsXDigit
  7011.  
  7012.    IsIt% = IsASCII%(Ch$)
  7013.  
  7014. Ch$       character to check
  7015. -------
  7016. IsIt%     -1 if the character is ASCII
  7017.  
  7018. Name  : IsCntrl%             (Is Control?)
  7019. Class : String
  7020. Level : Any
  7021.  
  7022. This function returns whether a character is a control code.
  7023. This is true for CHR$(0)-CHR$(32) and CHR$(127).
  7024.  
  7025. Functions in this family include:
  7026.    IsAlNum, IsAlpha, IsASCII, IsCntrl, IsDigit, IsLower,
  7027.    IsPrint, IsPunct, IsSpace, IsUpper, IsXDigit
  7028.  
  7029.    IsIt% = IsCntrl%(Ch$)
  7030.  
  7031. Ch$       character to check
  7032. -------
  7033. IsIt%     -1 if the character is a control code
  7034.  
  7035. Name  : IsDigit%             (Is Digit?)
  7036. Class : String
  7037. Level : Any
  7038.  
  7039. This function returns whether a character is numeric.
  7040.  
  7041. Functions in this family include:
  7042.    IsAlNum, IsAlpha, IsASCII, IsCntrl, IsDigit, IsLower,
  7043.    IsPrint, IsPunct, IsSpace, IsUpper, IsXDigit
  7044.  
  7045.    IsIt% = IsDigit%(Ch$)
  7046.  
  7047. Ch$       character to check
  7048. -------
  7049. IsIt%     -1 if the character is a digit
  7050.  
  7051. Name  : IsLower%             (Is Lowercase?)
  7052. Class : String
  7053. Level : Any
  7054.  
  7055. This function returns whether a character is a lowercase letter.
  7056.  
  7057. Functions in this family include:
  7058.    IsAlNum, IsAlpha, IsASCII, IsCntrl, IsDigit, IsLower,
  7059.    IsPrint, IsPunct, IsSpace, IsUpper, IsXDigit
  7060.  
  7061.    IsIt% = IsLower%(Ch$)
  7062.  
  7063. Ch$       character to check
  7064. -------
  7065. IsIt%     -1 if the character is a lowercase letter
  7066.  
  7067. Name  : IsPrint%             (Is Printable?)
  7068. Class : String
  7069. Level : Any
  7070.  
  7071. This function returns whether a character is printable. This is
  7072. true for CHR$(32)-CHR$(126).
  7073.  
  7074. Functions in this family include:
  7075.    IsAlNum, IsAlpha, IsASCII, IsCntrl, IsDigit, IsLower,
  7076.    IsPrint, IsPunct, IsSpace, IsUpper, IsXDigit
  7077.  
  7078.    IsIt% = IsPrint%(Ch$)
  7079.  
  7080. Ch$       character to check
  7081. -------
  7082. IsIt%     -1 if the character is printable
  7083.  
  7084. Name  : IsPunct%             (Is Punctuation?)
  7085. Class : String
  7086. Level : Any
  7087.  
  7088. This function returns whether a character is punctuation. This
  7089. is true for any ASCII character that is not alphabetic, numeric,
  7090. or a control code; and for a space.
  7091.  
  7092. Functions in this family include:
  7093.    IsAlNum, IsAlpha, IsASCII, IsCntrl, IsDigit, IsLower,
  7094.    IsPrint, IsPunct, IsSpace, IsUpper, IsXDigit
  7095.  
  7096.    IsIt% = IsPunct%(Ch$)
  7097.  
  7098. Ch$       character to check
  7099. -------
  7100. IsIt%     -1 if the character is punctuation
  7101.  
  7102. Name  : IsSpace%             (Is Space?)
  7103. Class : String
  7104. Level : Any
  7105.  
  7106. This function returns whether a character is white space. This
  7107. includes Space, Carriage Return, Horizontal Tab, Vertical Tab,
  7108. LineFeed, and FormFeed characters.
  7109.  
  7110. Functions in this family include:
  7111.    IsAlNum, IsAlpha, IsASCII, IsCntrl, IsDigit, IsLower,
  7112.    IsPrint, IsPunct, IsSpace, IsUpper, IsXDigit
  7113.  
  7114.    IsIt% = IsSpace%(Ch$)
  7115.  
  7116. Ch$       character to check
  7117. -------
  7118. IsIt%     -1 if the character is white space
  7119.  
  7120. Name  : IStr$                (Integer STR$)
  7121. Class : String
  7122. Level : Any
  7123.  
  7124. This function is identical to the BASIC function STR$, but is
  7125. somewhat smaller. It is only for integer values.
  7126.  
  7127. If you prefer not to have a leading blank for non-negative
  7128. numbers, use the IStrNB$ function instead.
  7129.  
  7130.    St$ = IStr$(Number%)
  7131.  
  7132. Number%   integer to convert
  7133. -------
  7134. St$       string form of the number
  7135.  
  7136. Name  : IStrNB$              (Integer STR$, No Blank)
  7137. Class : String
  7138. Level : Any
  7139.  
  7140. This function is similar to the BASIC function STR$, but is
  7141. somewhat smaller. It is only for integer values. Unlike the STR$
  7142. function, this function does not add a leading blank to
  7143. non-negative numbers.
  7144.  
  7145. If you prefer to have a leading blank for non-negative numbers,
  7146. use the IStr$ function instead.
  7147.  
  7148.    St$ = IStrNB$(Number%)
  7149.  
  7150. Number%   integer to convert
  7151. -------
  7152. St$       string form of the number
  7153.  
  7154. Name  : IsUpper%             (Is Uppercase?)
  7155. Class : String
  7156. Level : Any
  7157.  
  7158. This function returns whether a character is an uppercase
  7159. letter.
  7160.  
  7161. Functions in this family include:
  7162.    IsAlNum, IsAlpha, IsASCII, IsCntrl, IsDigit, IsLower,
  7163.    IsPrint, IsPunct, IsSpace, IsUpper, IsXDigit
  7164.  
  7165.    IsIt% = IsUpper%(Ch$)
  7166.  
  7167. Ch$       character to check
  7168. -------
  7169. IsIt%     -1 if the character is uppercase
  7170.  
  7171. Name  : IsXDigit%            (Is Hex Digit?)
  7172. Class : String
  7173. Level : Any
  7174.  
  7175. This function returns whether a character is a hexadecimal
  7176. digit.
  7177.  
  7178. Functions in this family include:
  7179.    IsAlNum, IsAlpha, IsASCII, IsCntrl, IsDigit, IsLower,
  7180.    IsPrint, IsPunct, IsSpace, IsUpper, IsXDigit
  7181.  
  7182.    IsIt% = IsXDigit%(Ch$)
  7183.  
  7184. Ch$       character to check
  7185. -------
  7186. IsIt%     -1 if the character is a hex digit
  7187.  
  7188. Name  : IVal%                (Integer VAL)
  7189. Class : Numeric
  7190. Level : Any
  7191.  
  7192. This routine is similar to the BASIC function VAL, but is much
  7193. faster. If you are not using floating point numbers, this
  7194. routine may also decrease the size of your program
  7195. significantly, since it won't cause BASIC to pull in its
  7196. floating point routines as VAL does.
  7197.  
  7198. Unlike VAL, this routine only converts strings to integer
  7199. values. It will not handle hex or octal strings. It will not
  7200. notify you if there is an overflow error. Finally, although
  7201. IVal% will ignore leading blanks, it assumes that a number may
  7202. not contain blanks, whereas VAL will ignore blanks in the middle
  7203. of a number:
  7204.  
  7205.      VAL("  12 34") returns 1234
  7206.    IVal%("  12 34") returns 12
  7207.  
  7208. Note that, like VAL (but unlike the IVal% function in ProBas),
  7209. multiple negation is considered illegal. For example, the result
  7210. of IVal%("--1") is zero.
  7211.  
  7212.    Number% = IVal%(St$)
  7213.  
  7214. St$       string to convert
  7215. -------
  7216. Number%   integer form of string (0 if there isn't one)
  7217.  
  7218. Name  : IWrite               (Integer Write)
  7219. Class : Disk
  7220. Level : DOS
  7221.  
  7222. This routine writes an integer (two binary bytes) to a file.
  7223.  
  7224. The file must have been opened using FCreate or FOpen1.
  7225.  
  7226.    IWrite Handle%, Value%, ErrCode%
  7227.  
  7228. Handle%    file handle
  7229. Value%     integer to write to file
  7230. -------
  7231. ErrCode%   DOS error code (0 if no error)
  7232.  
  7233. Name  : JButtonA1%           (Joystick Button A1)
  7234. Class : Input
  7235. Level : BIOS
  7236.  
  7237. This function returns the status of joystick A button 1. The
  7238. result will be -1 if the button is pressed, or 0 if not.
  7239.  
  7240. If you need information on more than one button, you will find
  7241. it substantially faster to use the JButtons routine, which
  7242. returns the status of all joystick buttons at once.
  7243.  
  7244. Note that this function will not work on the oldest PCs (those
  7245. made before 1983 or so).
  7246.  
  7247.    Status% = JButtonA1%
  7248.  
  7249. -------
  7250. Status%      whether joystick A button 1 is pressed (0 no)
  7251.  
  7252. Name  : JButtonA2%           (Joystick Button A2)
  7253. Class : Input
  7254. Level : BIOS
  7255.  
  7256. This function returns the status of joystick A button 2. The
  7257. result will be -1 if the button is pressed, or 0 if not.
  7258.  
  7259. If you need information on more than one button, you will find
  7260. it substantially faster to use the JButtons routine, which
  7261. returns the status of all joystick buttons at once.
  7262.  
  7263. Note that this function will not work on the oldest PCs (those
  7264. made before 1983 or so).
  7265.  
  7266.    Status% = JButtonA2%
  7267.  
  7268. -------
  7269. Status%      whether joystick A button 2 is pressed (0 no)
  7270.  
  7271. Name  : JButtonB1%           (Joystick Button B1)
  7272. Class : Input
  7273. Level : BIOS
  7274.  
  7275. This function returns the status of joystick B button 1. The
  7276. result will be -1 if the button is pressed, or 0 if not.
  7277.  
  7278. If you need information on more than one button, you will find
  7279. it substantially faster to use the JButtons routine, which
  7280. returns the status of all joystick buttons at once.
  7281.  
  7282. Note that this function will not work on the oldest PCs (those
  7283. made before 1983 or so).
  7284.  
  7285.    Status% = JButtonB1%
  7286.  
  7287. -------
  7288. Status%      whether joystick B button 1 is pressed (0 no)
  7289.  
  7290. Name  : JButtonB2%           (Joystick Button B2)
  7291. Class : Input
  7292. Level : BIOS
  7293.  
  7294. This function returns the status of joystick B button 2. The
  7295. result will be -1 if the button is pressed, or 0 if not.
  7296.  
  7297. If you need information on more than one button, you will find
  7298. it substantially faster to use the JButtons routine, which
  7299. returns the status of all joystick buttons at once.
  7300.  
  7301. Note that this function will not work on the oldest PCs (those
  7302. made before 1983 or so).
  7303.  
  7304.    Status% = JButtonB2%
  7305.  
  7306. -------
  7307. Status%      whether joystick B button 2 is pressed (0 no)
  7308.  
  7309. Name  : JButtons             (Joystick Buttons)
  7310. Class : Input
  7311. Level : BIOS
  7312.  
  7313. This routine returns the status of all joystick buttons. The
  7314. result will be -1 if the button is pressed, or 0 if not.
  7315.  
  7316. This routine is ideal if you need to check more than one
  7317. joystick button. It is substantially faster than using several
  7318. single-button status functions. However, if you only need to
  7319. check a single button, or speed is not an issue, you may find it
  7320. more convenient to use the functions:
  7321.    JButtonA1%, JButtonA2%, JButtonB1%, JButtonB2%
  7322.  
  7323. Note that this routine will not work on the oldest PCs (those
  7324. made before 1983 or so).
  7325.  
  7326.    JButtons A1%, A2%, B1%, B2%
  7327.  
  7328. -------
  7329. A1%        whether joystick A button 1 is pressed (0 no)
  7330. A2%        whether joystick A button 2 is pressed (0 no)
  7331. B1%        whether joystick B button 1 is pressed (0 no)
  7332. B2%        whether joystick B button 2 is pressed (0 no)
  7333.  
  7334. Name  : JPos                 (Joystick Positions)
  7335. Class : Input
  7336. Level : BIOS
  7337.  
  7338. This routine returns the X,Y positions of both joysticks. If
  7339. there is only one joystick attached, the results for the second
  7340. joystick will usually be meaningless-- except in the case of the
  7341. FlightStick, which returns the "throttle" status via the Y
  7342. position of an imaginary joystick B.
  7343.  
  7344. Note that X represents the horizontal axis and Y the vertical.
  7345. I've seen considerable confusion on that topic... I use the
  7346. standard mathematical convention here.
  7347.  
  7348. The range of values returned depends on the individual joystick
  7349. and may drift somewhat. You would be well advised to include a
  7350. joystick "calibration" routine in your program to customize your
  7351. settings to the particular joystick used. I find a range of
  7352. about 5-140 on my FlightStick; your mileage may vary.
  7353.  
  7354. Note that this routine will not work on the oldest PCs (those
  7355. made before 1983 or so).
  7356.  
  7357.    JPos AX%, AY%, BX%, BY%
  7358.  
  7359. -------
  7360. AX%        X position of joystick A
  7361. AY%        Y position of joystick A
  7362. BX%        X position of joystick B
  7363. BY%        Y position of joystick B (or FlightStick throttle)
  7364.  
  7365. Name  : KbdType              (Keyboard Type)
  7366. Class : Input / Equipment
  7367. Level : Clone
  7368.  
  7369. This routine tells you if an enhanced (101-key) keyboard is
  7370. available.
  7371.  
  7372. If KbdType is not entirely sure that an enhanced keyboard is
  7373. available, it plays safe and assumes there isn't one. This
  7374. avoids possible disaster on older PCs.
  7375.  
  7376.    KbdType Enhanced%
  7377.  
  7378. -------
  7379. Enhanced%    whether keyboard is of the enhanced type (0 no)
  7380.  
  7381. Name  : KbdType2%            (Keyboard Type)
  7382. Class : Input / Equipment
  7383. Level : Clone
  7384.  
  7385. This routine tells you if an enhanced (101-key) keyboard is
  7386. available.
  7387.  
  7388. If KbdType2% is not entirely sure that an enhanced keyboard is
  7389. available, it plays safe and assumes there isn't one. This
  7390. avoids possible disaster on older PCs.
  7391.  
  7392.    Enhanced% = KbdType2%
  7393.  
  7394. -------
  7395. Enhanced%    whether keyboard is of the enhanced type (0 no)
  7396.  
  7397. Name  : KeyPress             (detect Key Press)
  7398. Class : Input
  7399. Level : DOS
  7400.  
  7401. This routine works like the Turbo/Power BASIC function INSTAT.
  7402. It tells you whether there is a key waiting to be processed.
  7403.  
  7404.    KeyPress KeyHit%
  7405.  
  7406. -------
  7407. KeyHit%   whether a key is waiting (0 if no)
  7408.  
  7409. Name  : KVal&                (Kilobyte VAL)
  7410. Class : Numeric
  7411. Level : Any
  7412.  
  7413. This routine is similar to the BASIC function VAL, but is much
  7414. faster. The number returned is divided by 1024, which is useful
  7415. if you're dealing in terms of kilobytes. If you are not using
  7416. floating point numbers, this routine may decrease the size of
  7417. your program significantly, since it won't cause BASIC to pull
  7418. in its floating point routines as VAL does.
  7419.  
  7420. Unlike VAL, this routine only converts strings to long integer
  7421. values. It will not handle hex or octal strings. It will not
  7422. notify you if there is an overflow error. Finally, although
  7423. KVal& will ignore leading blanks, it assumes that a number may
  7424. not contain blanks, whereas VAL will ignore blanks in the middle
  7425. of a number.
  7426.  
  7427. Note that, like VAL (but unlike the KVal& function in ProBas),
  7428. multiple negation is considered illegal. For example, the result
  7429. of KVal&("--10000") is zero.
  7430.  
  7431.    Number& = KVal&(St$)
  7432.  
  7433. St$       string to convert
  7434. -------
  7435. Number&   long integer form of string, divided by 1024
  7436.  
  7437. Name  : LClickLoc            (Left Click Location)
  7438. Class : Mouse
  7439. Level : BIOS
  7440.  
  7441. This routine returns the position of the mouse cursor at the
  7442. last click of the left mouse button. It must be used after one
  7443. of the routines which check for mouse clicks, as they maintain
  7444. the click position. These routines include GetKey, GetKey3,
  7445. MMClick, and MMClick3.
  7446.  
  7447. The values returned are in graphics coordinates (virtual
  7448. coordinates for SCREEN 0 through SCREEN 2, due to the nature of
  7449. the mouse driver).
  7450.  
  7451.    LClickLoc X%, Y%
  7452.  
  7453. -------
  7454. X%         horizontal coordinate at last left click
  7455. Y%         vertical coordinate at last left click
  7456.  
  7457. Name  : LClose               (L/I/M Close)
  7458. Class : Memory
  7459. Level : BIOS
  7460.  
  7461. This routine closes a block of expanded memory that was opened
  7462. for access by LOpen. It is important to close the block when you
  7463. are finished with it, to return it to the free memory pool.
  7464.  
  7465. Routines in this suite include: LOpen, LGet, LPut, LClose.
  7466.  
  7467.    LClose EMSHandle%
  7468.  
  7469. EMSHandle%    handle of the expanded memory block
  7470.  
  7471. Name  : LGet                 (L/I/M Get)
  7472. Class : Memory
  7473. Level : BIOS
  7474.  
  7475. This routine gets a block of data from expanded memory that was
  7476. opened for access by LOpen. The amount of data is specified in
  7477. words; one word is the same as two bytes. An integer takes up a
  7478. word, long integers and single precision numbers require two
  7479. words, and double precision numbers take four.
  7480.  
  7481. Routines in this suite include: LOpen, LGet, LPut, LClose.
  7482.  
  7483.    LGet EMSHandle%, DSeg%, DOfs%, Words%
  7484.  
  7485. EMSHandle%    handle of the expanded memory block
  7486. DSeg%         segment of place to store data
  7487. DOfs%         offset of place to store data
  7488. Words%        words to get from expanded memory
  7489.  
  7490. Name  : LIRead               (Long Integer Read)
  7491. Class : Disk
  7492. Level : DOS
  7493.  
  7494. This routine reads an integer from a file into a long integer.
  7495. The integer is zero-extended into the long, providing effective
  7496. support for unsigned integers (a range of 0-65535).
  7497.  
  7498. The file must have been opened using FCreate or FOpen1.
  7499.  
  7500.    LIRead Handle%, Value&, ErrCode%
  7501.  
  7502. Handle%    file handle
  7503. -------
  7504. Value&     integer read from file
  7505. ErrCode%   DOS error code (0 if no error)
  7506.  
  7507. Name  : LIWrite              (Long Integer Write)
  7508. Class : Disk
  7509. Level : DOS
  7510.  
  7511. This routine writes an integer to a file from a long integer.
  7512. This makes it easier to support unsigned integers (with a range
  7513. of 0-65535).
  7514.  
  7515. The file must have been opened using FCreate or FOpen1.
  7516.  
  7517.    LIWrite Handle%, Value&, ErrCode%
  7518.  
  7519. Handle%    file handle
  7520. Value&     integer to write to file
  7521. -------
  7522. ErrCode%   DOS error code (0 if no error)
  7523.  
  7524. Name  : LoadDir              (Load Directory)
  7525. Class : Disk
  7526. Level : DOS
  7527.  
  7528. Given a filespec with wildcards and a file attribute, this
  7529. routine loads a list of all matching files into an array. The
  7530. array must be of fixed-length string type, with 12 characters
  7531. for each filename. You can find out how large to DIM the array
  7532. by using the FileCount routine.
  7533.  
  7534. The attribute can be any of the usual file attributes:
  7535.    1   Read-Only
  7536.    2   Hidden
  7537.    4   System
  7538.   16   Directory
  7539.  
  7540. You can combine attributes by adding their values. For instance,
  7541. to search for hidden directories, you'd use an attribute of 18.
  7542. By default, DOS returns normal files as well as files which have
  7543. the specified attributes, so an attribute of 18 would get you
  7544. normal files, hidden files, directories, and hidden directories.
  7545. However, LoadDir can be made to screen out unwanted files-- just
  7546. negate the attribute to force only files of that attribute to be
  7547. counted. For example, an attribute of -18 would return only
  7548. hidden subdirectories.
  7549.  
  7550. NOTE: we use FilAttr%, not FileAttr%, because BASIC has an
  7551. internal function named FILEATTR.
  7552.  
  7553.    LoadDir FileSpec$, FilAttr%, DSeg%, DOfs%, ErrCode%
  7554.  
  7555. FileSpec$    search file specification (may contain wildcards)
  7556. FilAttr%     search file attribute
  7557. DSeg%        segment of fixed-length-string array (use VARSEG)
  7558. DOfs%        offset of fixed-length-string array (use VARPTR)
  7559. -------
  7560. ErrCode%     error code (0 if no error)
  7561.  
  7562. Name  : LoadDirAll           (Load Directory, All info)
  7563. Class : Disk
  7564. Level : DOS
  7565.  
  7566. Given a filespec with wildcards and a file attribute, this
  7567. routine loads a list of all matching files into an array. All
  7568. available information about the file is included: name, size,
  7569. time, date, and attribute. The array must be of the TYPE shown
  7570. below. You can find out how large to DIM the array by using the
  7571. FileCount routine.
  7572.  
  7573.    TYPE DirType
  7574.       FilAttr AS STRING * 1
  7575.       FilTime AS INTEGER
  7576.       FilDate AS INTEGER
  7577.       FilSize AS LONG
  7578.       FilName AS STRING * 12
  7579.    END TYPE
  7580.  
  7581. You can change the names if you like, but don't alter the order
  7582. of the information. You can decode the file attribute with the
  7583. ASC function, then process it with ExplainFAttr$. The file time
  7584. and date can be decoded with the Int2Time and Int2Date or
  7585. Int2TimeSt$ and Int2DateSt$ routines.
  7586.  
  7587. The attribute can be any of the usual file attributes:
  7588.    1   Read-Only
  7589.    2   Hidden
  7590.    4   System
  7591.   16   Directory
  7592.  
  7593. You can combine attributes by adding their values. For instance,
  7594. to search for hidden directories, you'd use an attribute of 18.
  7595. By default, DOS returns normal files as well as files which have
  7596. the specified attributes, so an attribute of 18 would get you
  7597. normal files, hidden files, directories, and hidden directories.
  7598. However, LoadDirAll can be made to screen out unwanted files--
  7599. just negate the attribute to force only files of that attribute
  7600. to be counted. For example, an attribute of -18 would return
  7601. only hidden subdirectories.
  7602.  
  7603. NOTE: we use FilAttr%, not FileAttr%, because BASIC has an
  7604. internal function named FILEATTR.
  7605.  
  7606.    LoadDirAll FileSpec$, FilAttr%, DSeg%, DOfs%, ErrCode%
  7607.  
  7608. FileSpec$    search file specification (may contain wildcards)
  7609. FilAttr%     search file attribute
  7610. DSeg%        segment of typed array (use VARSEG)
  7611. DOfs%        offset of typed array (use VARPTR)
  7612. -------
  7613. ErrCode%     error code (0 if no error)
  7614.  
  7615. Name  : LoByte%              (Low Byte)
  7616. Class : Numeric
  7617. Level : Any
  7618.  
  7619. This function returns the low byte of an integer.
  7620.  
  7621.    Byte% = LoByte%(Nr%)
  7622.  
  7623. Nr%        integer
  7624. -------
  7625. Byte%      value of the least significant byte
  7626.  
  7627. Name  : Locase               (Lowercase)
  7628. Class : String
  7629. Level : Any
  7630.  
  7631. This routine, like BASIC's LCASE$ function, converts a string to
  7632. lowercase. Since it doesn't have to create a new return string
  7633. (a fairly slow process), it's faster than the BASIC equivalent.
  7634.  
  7635. See also Locase1.
  7636.  
  7637.    Locase St$
  7638.  
  7639. St$     string to be put into lowercase
  7640. -------
  7641. St$     lowercase string
  7642.  
  7643. Name  : Locase1              (Lowercase)
  7644. Class : String
  7645. Level : Any
  7646.  
  7647. This routine, like BASIC's LCASE$ function, converts a string to
  7648. lowercase. It converts letters in the extended character set as
  7649. well as the usual letters, making it well suited for text which
  7650. may not be in English.
  7651.  
  7652. Note that DOS 5.0 and later versions provide National Language
  7653. Support which includes conversion to uppercase (not lowercase,
  7654. unfortunately). So, if you merely need the characters in a known
  7655. state, rather than lowercase, you would do better to use the
  7656. Upcase1 routine. Locase1 assumes the U.S. character set, which
  7657. may well not be appropriate.
  7658.  
  7659. See also Locase.
  7660.  
  7661.    Locase1 St$
  7662.  
  7663. St$     string to be put into lowercase
  7664. -------
  7665. St$     lowercase string
  7666.  
  7667. Name  : LogicalDrives%       (Logical Drives)
  7668. Class : Disk / Equipment
  7669. Level : DOS
  7670.  
  7671. This function returns the number of logical drives available.
  7672.  
  7673. A logical drive corresponds roughly to a drive letter-- it may
  7674. point to zero or more actual devices. For instance, on a
  7675. one-floppy system, both A: and B: point to the same drive. On a
  7676. partitioned hard drive, both C: and D: may point to different
  7677. areas of the same drive. Drive E: may point to a RAMdisk, or
  7678. maybe it doesn't point to anything at all.
  7679.  
  7680. As you can see, knowing the number of logical drives doesn't
  7681. tell you much about what's actually there. However, it does give
  7682. you an upper limit on the number of drive letters available,
  7683. which is a good place to start.
  7684.  
  7685.    Drives% = LogicalDrives%
  7686.  
  7687. -------
  7688. Drives%    number of logical drives
  7689.  
  7690. Name  : LOpen                (L/I/M Open)
  7691. Class : Memory
  7692. Level : BIOS
  7693.  
  7694. This routine opens a block of expanded memory for access. The
  7695. size of the block is specified in words; one word is the same as
  7696. two bytes. An integer takes up a word, long integers and single
  7697. precision numbers require two words, and double precision
  7698. numbers take four. This allows you to store up to 64K in each
  7699. EMS block that you open.
  7700.  
  7701. Note that LOpen expects an EMS driver to be available. If you
  7702. are not certain on this point, use GetLIMM beforehand to make
  7703. sure.
  7704.  
  7705. Routines in this suite include:
  7706.    LOpen, LGet, LPut, LClose.
  7707.  
  7708.    LOpen Words%, EMSHandle%, ErrCode%
  7709.  
  7710. Words%        size of expanded memory block to allocate
  7711. -------
  7712. EMSHandle%    handle of the expanded memory block
  7713. ErrCode%      error code (0 if no error)
  7714.  
  7715. Name  : LoWord%              (Low Word)
  7716. Class : Numeric
  7717. Level : Any
  7718.  
  7719. This function returns the low word of a long integer.
  7720.  
  7721.    Word% = LoWord%(Nr&)
  7722.  
  7723. Nr&        long integer
  7724. -------
  7725. Word%      value of the least significant word
  7726.  
  7727. Name  : LPut                 (L/I/M Put)
  7728. Class : Memory
  7729. Level : BIOS
  7730.  
  7731. This routine puts a block of data into expanded memory that was
  7732. opened for access by LOpen. The amount of data is specified in
  7733. words; one word is the same as two bytes. An integer takes up a
  7734. word, long integers and single precision numbers require two
  7735. words, and double precision numbers take four.
  7736.  
  7737. Routines in this suite include:
  7738.    LOpen, LGet, LPut, LClose.
  7739.  
  7740.    LPut EMSHandle%, DSeg%, DOfs%, Words%
  7741.  
  7742. EMSHandle%    handle of the expanded memory block
  7743. DSeg%         segment of place from which to get data
  7744. DOfs%         offset of place from which to get data
  7745. Words%        words to put into expanded memory
  7746.  
  7747. Name  : LRead                (Long Read)
  7748. Class : Disk
  7749. Level : DOS
  7750.  
  7751. This routine reads a long integer (four binary bytes) from a
  7752. file.
  7753.  
  7754. The file must have been opened using FCreate or FOpen1.
  7755.  
  7756.    LRead Handle%, Value&, ErrCode%
  7757.  
  7758. Handle%    file handle
  7759. -------
  7760. Value&     long integer read from file
  7761. ErrCode%   DOS error code (0 if no error)
  7762.  
  7763. Name  : LRotate              (Left Rotate string)
  7764. Class : String
  7765. Level : Any
  7766.  
  7767. Many years ago, I wrote one of the first terminal programs for
  7768. the PC. It died a horrible death when Qmodem came out... sigh.
  7769. This routine comes from that experience. It rotates the
  7770. characters in a string left once (e.g., "ABCDE" becomes
  7771. "BCDEA"). I used this in my routine to dial a list of BBSes,
  7772. skipping to the next one if the current one was busy.
  7773.  
  7774. LRotate can also be handy for things like scrolling a long
  7775. message across the screen (you just PRINT LEFT$(Message$, 80);
  7776. then delay a bit, LRotate and do it again).
  7777.  
  7778. See also RRotate.
  7779.  
  7780.    LRotate St$
  7781.  
  7782. St$     string to be rotated left once
  7783. -------
  7784. St$     string after being rotated left once
  7785.  
  7786. Name  : LScroll              (Left Scroll)
  7787. Class : Display
  7788. Level : Clone
  7789.  
  7790. This routine scrolls any selected part of the display left. You
  7791. may scroll as many times as you like, or scroll "zero" times to
  7792. totally clear the selected part of the display.
  7793.  
  7794.    LScroll TopRow%, LeftCol%, BottomRow%, RightCol%, Times%
  7795.  
  7796. TopRow%      top row of the area to scroll
  7797. LeftCol%     left column of the area to scroll
  7798. BottomRow%   top row of the area to scroll
  7799. RightCol%    left column of the area to scroll
  7800. Times%       number of times (or rows) to scroll
  7801.  
  7802. Name  : LVal&                (Long integer VAL)
  7803. Class : Numeric
  7804. Level : Any
  7805.  
  7806. This routine is similar to the BASIC function VAL, but is much
  7807. faster. If you are not using floating point numbers, this
  7808. routine may also decrease the size of your program quite a bit,
  7809. since it won't cause BASIC to pull in its floating point
  7810. routines as VAL does.
  7811.  
  7812. Unlike VAL, this routine only converts strings to long integer
  7813. values. It will not handle hex or octal strings. It will not
  7814. notify you if there is an overflow error. Finally, although
  7815. LVal& will ignore leading blanks, it assumes that a number may
  7816. not contain blanks, whereas VAL will ignore blanks in the middle
  7817. of a number:
  7818.  
  7819.      VAL("  12 34") returns 1234
  7820.    LVal&("  12 34") returns 12
  7821.  
  7822. Note that, like VAL (but unlike the LVal& function in ProBas),
  7823. multiple negation is considered illegal. For example, the result
  7824. of LVal&("--1") is zero.
  7825.  
  7826.    Number& = LVal&(St$)
  7827.  
  7828. St$       string to convert
  7829. -------
  7830. Number&   long integer form of string (0 if there isn't one)
  7831.  
  7832. Name  : LWrite               (Long Write)
  7833. Class : Disk
  7834. Level : DOS
  7835.  
  7836. This routine writes a long integer to a file.
  7837.  
  7838. The file must have been opened using FCreate or FOpen1.
  7839.  
  7840.    LWrite Handle%, Value&, ErrCode%
  7841.  
  7842. Handle%    file handle
  7843. Value&     long integer to write to file
  7844. -------
  7845. ErrCode%   DOS error code (0 if no error)
  7846.  
  7847. Name  : MakeSub              (Make Subdirectory)
  7848. Class : Disk
  7849. Level : DOS
  7850.  
  7851. Like the DOS MD (or MKDIR) command, this routine creates a new
  7852. subdirectory.
  7853.  
  7854.    MakeSub SubDir$, ErrCode%
  7855.  
  7856. SubDir$    name of new subdirectory
  7857. -------
  7858. ErrCode%   error code: 0 if none, else DOS Error
  7859.  
  7860. Name  : MatchFile            (Match File)
  7861. Class : Disk / String
  7862. Level : Any
  7863.  
  7864. The MatchFile routine tells you whether a given filename matches
  7865. a file specification which may contain wildcards. The filename
  7866. itself should not contain wildcards. Neither the filename nor
  7867. filespec should include drive or subdirectory specifications.
  7868.  
  7869. One way of using this is in processing file exclusion lists. The
  7870. FindFirstF routine allows you to find files that match a given
  7871. filespec; to this, you could add a MatchFile-based routine which
  7872. would screen out files that match a different filespec. Such a
  7873. routine would allow you to create utilities to do things like
  7874. "DIR *.* /EXCEPT=*.BAS".
  7875.  
  7876.    MatchFile FileSpec$, FileName$, IsMatch%
  7877.  
  7878. FileSpec$   master file pattern (may contain wildcards)
  7879. FileName$   name of file to test against the master pattern
  7880. -------
  7881. IsMatch%    0 if the filename doesn't match the filespec
  7882.  
  7883. Name  : MatShuffleD          (Matrix Shuffle Double-prec)
  7884. Class : Array
  7885. Level : Any
  7886.  
  7887. This routine shuffles the elements in a double-precision array,
  7888. efficiently randomizing their order. It relies on the RND
  7889. function, so you'd be advised to use the RANDOMIZE statement at
  7890. the top of your program unless you want the results to be
  7891. predictable. A good way of initializing the random number
  7892. generator is:
  7893.  
  7894.    RANDOMIZE TIMER
  7895.  
  7896. You can specify the starting and ending positions in the array
  7897. to shuffle, so you don't have to shuffle the entire array.
  7898.  
  7899. See also the string shuffle, ShuffleSt, and other array
  7900. shuffles: MatShuffleI, MatShuffleL, MatShuffleS, MatShuffleSt
  7901.  
  7902.    MatShuffleD Array#(), StartPosn%, EndPosn%
  7903.  
  7904. Array#()     array to shuffle
  7905. StartPosn%   element at which to begin shuffling
  7906. EndPosn%     element at which to stop shuffling
  7907. -------
  7908. Array#()     shuffled array
  7909.  
  7910. Name  : MatShuffleI          (Matrix Shuffle Integer)
  7911. Class : Array
  7912. Level : Any
  7913.  
  7914. This routine shuffles the elements in an integer array,
  7915. efficiently randomizing their order. It relies on the RND
  7916. function, so you'd be advised to use the RANDOMIZE statement at
  7917. the top of your program unless you want the results to be
  7918. predictable. A good way of initializing the random number
  7919. generator is:
  7920.  
  7921.    RANDOMIZE TIMER
  7922.  
  7923. You can specify the starting and ending positions in the array
  7924. to shuffle, so you don't have to shuffle the entire array.
  7925.  
  7926. See also the string shuffle, ShuffleSt, and other array
  7927. shuffles: MatShuffleD, MatShuffleL, MatShuffleS, MatShuffleSt
  7928.  
  7929.    MatShuffleI Array%(), StartPosn%, EndPosn%
  7930.  
  7931. Array%()     array to shuffle
  7932. StartPosn%   element at which to begin shuffling
  7933. EndPosn%     element at which to stop shuffling
  7934. -------
  7935. Array%()     shuffled array
  7936.  
  7937. Name  : MatShuffleL          (Matrix Shuffle Long integer)
  7938. Class : Array
  7939. Level : Any
  7940.  
  7941. This routine shuffles the elements in a long integer array,
  7942. efficiently randomizing their order. It relies on the RND
  7943. function, so you'd be advised to use the RANDOMIZE statement at
  7944. the top of your program unless you want the results to be
  7945. predictable. A good way of initializing the random number
  7946. generator is:
  7947.  
  7948.    RANDOMIZE TIMER
  7949.  
  7950. You can specify the starting and ending positions in the array
  7951. to shuffle, so you don't have to shuffle the entire array.
  7952.  
  7953. See also the string shuffle, ShuffleSt, and other array
  7954. shuffles: MatShuffleD, MatShuffleI, MatShuffleS, MatShuffleSt
  7955.  
  7956.    MatShuffleL Array&(), StartPosn%, EndPosn%
  7957.  
  7958. Array&()     array to shuffle
  7959. StartPosn%   element at which to begin shuffling
  7960. EndPosn%     element at which to stop shuffling
  7961. -------
  7962. Array&()     shuffled array
  7963.  
  7964. Name  : MatShuffleS          (Matrix Shuffle Single-prec)
  7965. Class : Array
  7966. Level : Any
  7967.  
  7968. This routine shuffles the elements in a single-precision array,
  7969. efficiently randomizing their order. It relies on the RND
  7970. function, so you'd be advised to use the RANDOMIZE statement at
  7971. the top of your program unless you want the results to be
  7972. predictable. A good way of initializing the random number
  7973. generator is:
  7974.  
  7975.    RANDOMIZE TIMER
  7976.  
  7977. You can specify the starting and ending positions in the array
  7978. to shuffle, so you don't have to shuffle the entire array.
  7979.  
  7980. See also the string shuffle, ShuffleSt, and other array
  7981. shuffles: MatShuffleD, MatShuffleI, MatShuffleL, MatShuffleSt
  7982.  
  7983.    MatShuffleS Array!(), StartPosn%, EndPosn%
  7984.  
  7985. Array!()     array to shuffle
  7986. StartPosn%   element at which to begin shuffling
  7987. EndPosn%     element at which to stop shuffling
  7988. -------
  7989. Array!()     shuffled array
  7990.  
  7991. Name  : MatShuffleSt         (Matrix Shuffle String)
  7992. Class : Array
  7993. Level : Any
  7994.  
  7995. This routine shuffles the elements in a string array,
  7996. efficiently randomizing their order. It relies on the RND
  7997. function, so you'd be advised to use the RANDOMIZE statement at
  7998. the top of your program unless you want the results to be
  7999. predictable. A good way of initializing the random number
  8000. generator is:
  8001.  
  8002.    RANDOMIZE TIMER
  8003.  
  8004. You can specify the starting and ending positions in the array
  8005. to shuffle, so you don't have to shuffle the entire array.
  8006.  
  8007. See also the string shuffle, ShuffleSt, and other array
  8008. shuffles: MatShuffleD, MatShuffleI, MatShuffleL, MatShuffleS
  8009.  
  8010.    MatShuffleSt Array$(), StartPosn%, EndPosn%
  8011.  
  8012. Array$()     array to shuffle
  8013. StartPosn%   element at which to begin shuffling
  8014. EndPosn%     element at which to stop shuffling
  8015. -------
  8016. Array$()     shuffled array
  8017.  
  8018. Name  : Max%                 (Maximum)
  8019. Class : Numeric
  8020. Level : Any
  8021.  
  8022. This function returns the larger of two integers. It can be
  8023. handy in sorting routines or for keeping a value within a
  8024. desired range.
  8025.  
  8026.    Larger% = Max%(First%, Second%)
  8027.  
  8028. First%     one integer
  8029. Second%    another integer
  8030. -------
  8031. Larger%    larger of the two integers
  8032.  
  8033. Name  : MaxD#                (Maximum Double precision)
  8034. Class : Numeric
  8035. Level : Any
  8036.  
  8037. This function returns the larger of two double-precision
  8038. numbers. It can be handy in sorting routines or for keeping a
  8039. value within a desired range.
  8040.  
  8041.    Larger# = MaxD#(First#, Second#)
  8042.  
  8043. First#     one number
  8044. Second#    another number
  8045. -------
  8046. Larger#    larger of the two numbers
  8047.  
  8048. Name  : MaxL&                (Maximum Long integer)
  8049. Class : Numeric
  8050. Level : Any
  8051.  
  8052. This function returns the larger of two long integers. It can be
  8053. handy in sorting routines or for keeping a value within a
  8054. desired range.
  8055.  
  8056.    Larger& = MaxL&(First&, Second&)
  8057.  
  8058. First&     one long integer
  8059. Second&    another long integer
  8060. -------
  8061. Larger&    larger of the two long integers
  8062.  
  8063. Name  : MaxS!                (Maximum Single precision)
  8064. Class : Numeric
  8065. Level : Any
  8066.  
  8067. This function returns the larger of two single-precision
  8068. numbers. It can be handy in sorting routines or for keeping a
  8069. value within a desired range.
  8070.  
  8071.    Larger! = MaxS!(First!, Second!)
  8072.  
  8073. First!     one number
  8074. Second!    another number
  8075. -------
  8076. Larger!    larger of the two numbers
  8077.  
  8078. Name  : MClickLoc            (Middle Click Location)
  8079. Class : Mouse
  8080. Level : BIOS
  8081.  
  8082. This routine returns the position of the mouse cursor at the
  8083. last click of the middle mouse button. It must be used after one
  8084. of the routines which check for mouse clicks, as they maintain
  8085. the click position. These routines include GetKey3 and MMClick3.
  8086.  
  8087. The values returned are in graphics coordinates (virtual
  8088. coordinates for SCREEN 0 through SCREEN 2, due to the nature of
  8089. the mouse driver).
  8090.  
  8091.    MClickLoc X%, Y%
  8092.  
  8093. -------
  8094. X%         horizontal coordinate at last middle click
  8095. Y%         vertical coordinate at last middle click
  8096.  
  8097. Name  : MeanAverageD         (Mean Average Double precision)
  8098. Class : Array management
  8099. Level : Any
  8100.  
  8101. This routine averages the specified range of elements in an
  8102. array of double precision numbers. The form of averaging used is
  8103. called the "mean", which is the sum of all of the elements
  8104. divided by the number of elements involved. This is the most
  8105. common method of averaging a list of numbers.
  8106.  
  8107.    MeanAverageD Array#(), First%, Last%, Average#, ErrCode%
  8108.  
  8109. Array#()    array to be averaged
  8110. First%      array element to start with
  8111. Last%       array element to end with
  8112. -------
  8113. Average#    average value of the specified elements
  8114. ErrCode%    0 if there was no error
  8115.  
  8116. Name  : MeanAverageI         (Mean Average Integer)
  8117. Class : Array management
  8118. Level : Any
  8119.  
  8120. This routine averages the specified range of elements in an
  8121. array of integer numbers. The form of averaging used is called
  8122. the "mean", which is the sum of all of the elements divided by
  8123. the number of elements involved. This is the most common method
  8124. of averaging a list of numbers.
  8125.  
  8126.    MeanAverageI Array%(), First%, Last%, Average%, ErrCode%
  8127.  
  8128. Array()     array to be averaged
  8129. First%      array element to start with
  8130. Last%       array element to end with
  8131. -------
  8132. Average%    average value of the specified elements
  8133. ErrCode%    0 if there was no error
  8134.  
  8135. Name  : MeanAverageL         (Mean Average Long integer)
  8136. Class : Array management
  8137. Level : Any
  8138.  
  8139. This routine averages the specified range of elements in an
  8140. array of long integer numbers. The form of averaging used is
  8141. called the "mean", which is the sum of all of the elements
  8142. divided by the number of elements involved. This is the most
  8143. common method of averaging a list of numbers.
  8144.  
  8145.    MeanAverageL Array&(), First%, Last%, Average&, ErrCode%
  8146.  
  8147. Array&()    array to be averaged
  8148. First%      array element to start with
  8149. Last%       array element to end with
  8150. -------
  8151. Average&    average value of the specified elements
  8152. ErrCode%    0 if there was no error
  8153.  
  8154. Name  : MeanAverageS         (Mean Average Single precision)
  8155. Class : Array management
  8156. Level : Any
  8157.  
  8158. This routine averages the specified range of elements in an
  8159. array of single precision numbers. The form of averaging used is
  8160. called the "mean", which is the sum of all of the elements
  8161. divided by the number of elements involved. This is the most
  8162. common method of averaging a list of numbers.
  8163.  
  8164.    MeanAverageS Array!(), First%, Last%, Average!, ErrCode%
  8165.  
  8166. Array!()    array to be averaged
  8167. First%      array element to start with
  8168. Last%       array element to end with
  8169. -------
  8170. Average!    average value of the specified elements
  8171. ErrCode%    0 if no error
  8172.  
  8173. Name  : MemSwap              (Memory Swap)
  8174. Class : Memory
  8175. Level : Any
  8176.  
  8177. MemSwap swaps the contents of one area of memory with another.
  8178. This can be used for a variety of things, from swapping a saved
  8179. screen with the actual screen to exchanging the contents of two
  8180. arrays.
  8181.  
  8182.    MemSwap DSeg1%, DOfs1%, DSeg2%, DOfs2%, Bytes%
  8183.  
  8184. DSeg1%     segment of first memory area
  8185. DOfs1%     offset of first memory area
  8186. DSeg2%     segment of second memory area
  8187. DOfs2%     offset of second memory area
  8188. Bytes%     bytes to swap
  8189.  
  8190. Name  : Min%                 (Minimum)
  8191. Class : Numeric
  8192. Level : Any
  8193.  
  8194. This function returns the smaller of two integers. It can be
  8195. handy in sorting routines or for keeping a value within a
  8196. desired range.
  8197.  
  8198.    Smaller% = Min%(First%, Second%)
  8199.  
  8200. First%     one integer
  8201. Second%    another integer
  8202. -------
  8203. Smaller%   smaller of the two integers
  8204.  
  8205. Name  : MinD#                (Minimum Double precision)
  8206. Class : Numeric
  8207. Level : Any
  8208.  
  8209. This function returns the smaller of two double-precision
  8210. numbers. It can be handy in sorting routines or for keeping a
  8211. value within a desired range.
  8212.  
  8213.    Smaller# = MinD#(First#, Second#)
  8214.  
  8215. First#     one number
  8216. Second#    another number
  8217. -------
  8218. Smaller#   smaller of the two numbers
  8219.  
  8220. Name  : MinL&                (Minimum Long integer)
  8221. Class : Numeric
  8222. Level : Any
  8223.  
  8224. This function returns the smaller of two long integers. It can
  8225. be handy in sorting routines or for keeping a value within a
  8226. desired range.
  8227.  
  8228.    Smaller& = MinL&(First&, Second&)
  8229.  
  8230. First&     one long integer
  8231. Second&    another long integer
  8232. -------
  8233. Smaller&   smaller of the two long integers
  8234.  
  8235. Name  : MinS!                (Minimum Single precision)
  8236. Class : Numeric
  8237. Level : Any
  8238.  
  8239. This function returns the smaller of two single-precision
  8240. numbers. It can be handy in sorting routines or for keeping a
  8241. value within a desired range.
  8242.  
  8243.    Smaller! = MinS!(First!, Second!)
  8244.  
  8245. First!     one number
  8246. Second!    another number
  8247. -------
  8248. Smaller!   smaller of the two numbers
  8249.  
  8250. Name  : MMButton             (Mouse Button)
  8251. Class : Mouse
  8252. Level : BIOS
  8253.  
  8254. The MMButton routine allows you to find out which mouse buttons
  8255. are pressed. Although it will work with any mouse, it is
  8256. designed specifically for a mouse with two buttons (see also
  8257. MMButton3). If you want to find out which buttons were pressed
  8258. in the past, rather than being pressed now, try MMClick instead.
  8259.  
  8260. This routine will not work properly if there is no mouse
  8261. available. Use the MMCheck routine if you are not sure.
  8262.  
  8263.    MMButton LeftB%, RightB%
  8264.  
  8265. -------
  8266. LeftB%     whether the left button is pressed
  8267. RightB%    whether the right button is pressed
  8268.  
  8269. Name  : MMButton3            (Mouse Button for 3-button mouse)
  8270. Class : Mouse
  8271. Level : BIOS
  8272.  
  8273. The MMButton3 routine allows you to find out which mouse buttons
  8274. are pressed. Although it will work with any mouse, it is
  8275. designed specifically for a mouse with three buttons (see also
  8276. MMButton). If you want to find out which buttons were pressed in
  8277. the past, rather than being pressed now, try MMClick3 instead.
  8278.  
  8279. This routine will not work properly if there is no mouse
  8280. available. Use the MMCheck routine if you are not sure.
  8281.  
  8282.    MMButton3 LeftB%, MiddleB%, RightB%
  8283.  
  8284. -------
  8285. LeftB%     whether the left button is pressed
  8286. MiddleB%   whether the middle button is pressed
  8287. RightB%    whether the right button is pressed
  8288.  
  8289. Name  : MMCheck              (Mouse Check and initialize)
  8290. Class : Mouse
  8291. Level : BIOS
  8292.  
  8293. This routine does a number of things. Primarily, it is intended
  8294. to let you check to see if a mouse is available. It returns a
  8295. zero if there is no mouse; if there is a mouse, the number of
  8296. mouse buttons is returned. The mouse status is also initialized,
  8297. so this is best used once at the beginning of your program.
  8298.  
  8299. All of the other mouse routines assume that a mouse is
  8300. available, so you should definitely use MMCheck if you're not
  8301. sure. Otherwise, results will be unusual at best, and the
  8302. computer may even lock up under some DOS versions.
  8303.  
  8304. There is also a function version of this routine, MMCheck2%.
  8305.  
  8306.    MMCheck Buttons%
  8307.  
  8308. -------
  8309. Buttons%   number of mouse buttons (0 if no mouse is installed)
  8310.  
  8311. Name  : MMCheck2%            (Mouse Check and initialize)
  8312. Class : Mouse
  8313. Level : BIOS
  8314.  
  8315. This function does a number of things. Primarily, it is intended
  8316. to let you check to see if a mouse is available. It returns a
  8317. zero if there is no mouse; if there is a mouse, the number of
  8318. mouse buttons is returned. The mouse status is also initialized,
  8319. so this is best used once at the beginning of your program.
  8320.  
  8321. All of the other mouse routines assume that a mouse is
  8322. available, so you should definitely use MMCheck2% if you're not
  8323. sure. Otherwise, results will be unusual at best, and the
  8324. computer may even lock up under some DOS versions.
  8325.  
  8326. There is also a sub version of this routine, MMCheck.
  8327.  
  8328.    Buttons% = MMCheck2%
  8329.  
  8330. -------
  8331. Buttons%   number of mouse buttons (0 if no mouse is installed)
  8332.  
  8333. Name  : MMClick              (Mouse Click)
  8334. Class : Mouse
  8335. Level : BIOS
  8336.  
  8337. The MMClick routine allows you to find out which mouse buttons
  8338. have been pressed since you last checked, and how many times
  8339. they were pressed. Although it will work with any mouse, it is
  8340. designed specifically for a mouse with two buttons (see also
  8341. MMClick3). If you want to find out which buttons are currently
  8342. being pressed, try MMButton instead.
  8343.  
  8344. See also the LClickLoc and RClickLoc routines, which allow you
  8345. to determine what the mouse position was at the last click.
  8346.  
  8347. This routine will not work properly if there is no mouse
  8348. available. Use the MMCheck routine if you are not sure.
  8349.  
  8350.    MMClick LeftB%, RightB%
  8351.  
  8352. -------
  8353. LeftB%     # of times left button was pressed since last check
  8354. RightB%    # of times right button was pressed since last check
  8355.  
  8356. Name  : MMClick3             (Mouse Click for 3-button mouse)
  8357. Class : Mouse
  8358. Level : BIOS
  8359.  
  8360. The MMClick3 routine allows you to find out which mouse buttons
  8361. have been pressed since you last checked, and how many times
  8362. they were pressed. Although it will work with any mouse, it is
  8363. designed specifically for a mouse with three buttons (see also
  8364. MMClick). If you want to find out which buttons are currently
  8365. being pressed, try MMButton3 instead.
  8366.  
  8367. See also the LClickLoc, MClickLoc and RClickLoc routines, which
  8368. allow you to determine what the mouse position was at the last
  8369. click.
  8370.  
  8371. This routine will not work properly if there is no mouse
  8372. available. Use the MMCheck routine if you are not sure.
  8373.  
  8374.    MMClick3 LeftB%, MiddleB%, RightB%
  8375.  
  8376. -------
  8377. LeftB%     # of times left button was pressed since last check
  8378. MiddleB%   # of times middle button was pressed since last look
  8379. RightB%    # of times right button was pressed since last check
  8380.  
  8381. Name  : MMCursorOff          (Mouse Cursor Off)
  8382. Class : Mouse
  8383. Level : BIOS
  8384.  
  8385. This routine makes the mouse cursor invisible. The mouse cursor
  8386. will still function as a location indicator, in the same way
  8387. that the normal cursor still functions when you make it
  8388. invisible.
  8389.  
  8390. Note that the mouse cursor is somewhat bizarre in that an
  8391. "invisibility level" is kept. Every time you use MMCursorOff,
  8392. the invisibility depth is increased; subsequent attempts to make
  8393. the cursor visible will not actually do so until the
  8394. invisibility depth reaches zero. In other words, if you call
  8395. MMCursorOff when the cursor is already invisible, the cursor
  8396. will not reappear until you've told it to reappear as many times
  8397. as you told it to disappear. This is fairly demented, but that's
  8398. the way Microsoft made it.
  8399.  
  8400. This routine will not work properly if no mouse is installed.
  8401. See MMCheck.
  8402.  
  8403.    MMCursorOff
  8404.  
  8405. Name  : MMCursorOn           (Mouse Cursor On)
  8406. Class : Mouse
  8407. Level : BIOS
  8408.  
  8409. This routine makes the mouse cursor visible, or tries to do
  8410. so...
  8411.  
  8412. The mouse cursor is somewhat bizarre in that an "invisibility
  8413. level" is kept. Every time you use MMCursorOff, the invisibility
  8414. depth is increased; subsequent attempts to make the cursor
  8415. visible will not actually do so until the invisibility depth
  8416. reaches zero. In other words, if you call MMCursorOff when the
  8417. cursor is already invisible, the cursor will not reappear until
  8418. you've told it to reappear (with MMCursorOn) as many times as
  8419. you told it to disappear. This is fairly demented, but that's
  8420. the way Microsoft made it.
  8421.  
  8422. Note that there is a flaw in BASIC such that a "mouse dropping"
  8423. may be left on the screen if your program is invoked at the
  8424. bottom of the DOS screen, causing a scroll while the mouse
  8425. cursor is visible. To avoid this, use VIEW PRINT at the
  8426. beginning of your program to remove the default "status line".
  8427. For the standard 80x25 text screen, this would be done like so:
  8428.  
  8429.    VIEW PRINT 1 TO 25
  8430.  
  8431. This routine will not work properly if no mouse is installed.
  8432. See MMCheck or MMCheck2%.
  8433.  
  8434.    MMCursorOn
  8435.  
  8436. Name  : MMGetLoc             (Mouse Get Location)
  8437. Class : Mouse
  8438. Level : BIOS
  8439.  
  8440. This routine allows you to get the current location of the mouse
  8441. cursor. It doesn't matter if the cursor is visible or invisible.
  8442.  
  8443. The mouse cursor location is somewhat perverse in CGA and text
  8444. modes, due to the sloppy design of Microsoft's original mouse
  8445. driver. In text modes and both CGA graphics modes, the cursor is
  8446. returned as if the screen is 640x200. To correct this for SCREEN
  8447. 1, divide the X coordinate by two. To correct this for text
  8448. modes, divide each coordinate by eight.
  8449.  
  8450. This routine will not work properly if there is no mouse
  8451. available. Use the MMCheck routine if you are not sure.
  8452.  
  8453. See also GetMouseLoc, which returns the appropriate coordinates
  8454. for text mode.
  8455.  
  8456.    MMGetLoc X%, Y%
  8457.  
  8458. -------
  8459. X%         X coordinate ("column")
  8460. Y%         Y coordinate ("row")
  8461.  
  8462. Name  : MMSetLoc             (Mouse Set Location)
  8463. Class : Mouse
  8464. Level : BIOS
  8465.  
  8466. This routine allows you to set the current location of the mouse
  8467. cursor. It doesn't matter if the cursor is visible or invisible.
  8468.  
  8469. The mouse cursor location is somewhat perverse in CGA and text
  8470. modes, due to the sloppy design of Microsoft's original mouse
  8471. driver. In text modes and both CGA graphics modes, the cursor is
  8472. returned as if the screen is 640x200. To correct this for SCREEN
  8473. 1, double the X coordinate. To correct this for text modes,
  8474. multiply each coordinate by eight and add four.
  8475.  
  8476. This routine will not work properly if there is no mouse
  8477. available. Use the MMCheck routine if you are not sure.
  8478.  
  8479. See also SetMouseLoc, which does the coordinate conversions for
  8480. you in text mode.
  8481.  
  8482.    MMSetLoc X%, Y%
  8483.  
  8484. X%         X coordinate ("column")
  8485. Y%         Y coordinate ("row")
  8486.  
  8487. Name  : MMSetRange           (Mouse Set Range)
  8488. Class : Mouse
  8489. Level : BIOS
  8490.  
  8491. This routine allows you to set the allowable range of mouse
  8492. cursor locations. The mouse cursor will not be permitted to go
  8493. outside this range. It doesn't matter if the cursor is visible
  8494. or invisible.
  8495.  
  8496. The mouse cursor location is somewhat perverse in CGA and text
  8497. modes, due to the sloppy design of Microsoft's original mouse
  8498. driver. In text modes and both CGA graphics modes, the cursor is
  8499. returned as if the screen is 640x200. To correct this for SCREEN
  8500. 1, double the X coordinate. To correct this for text modes,
  8501. multiply each coordinate by eight and add four.
  8502.  
  8503. This routine will not work properly if there is no mouse
  8504. available. Use the MMCheck routine if you are not sure.
  8505.  
  8506.    MMSetRange X1%, Y1%, X2%, Y2%
  8507.  
  8508. X1%       left   X coordinate (upper left "column")
  8509. Y1%       top    Y coordinate (upper left "row")
  8510. X2%       right  X coordinate (lower right "column")
  8511. Y2%       bottom Y coordinate (lower right "row")
  8512.  
  8513. Name  : Month0               (Month)
  8514. Class : String / Time
  8515. Level : Any
  8516.  
  8517. Given a month number, this routine tells you the name of the
  8518. month.
  8519.  
  8520.    MonthName$ = SPACE$(9)
  8521.    Month0 MonthName$, NameLen%, MonthNr%
  8522.    MonthName$ = LEFT$(MonthName$, NameLen)
  8523.  
  8524. MonthNr%    month number (1-12)
  8525. -------
  8526. MonthName$  name of the month.  Init to at least 9 characters.
  8527. NameLen%    length of the month name
  8528.  
  8529. Name  : MouseBuffer          (Mouse Buffer size)
  8530. Class : Mouse
  8531. Level : BIOS
  8532.  
  8533. This routine is used before MouseSave in order to find out how
  8534. many bytes are needed to save the mouse state.
  8535.  
  8536. This routine will not work properly if there is no mouse
  8537. available. Use the MMCheck routine if you are not sure.
  8538.  
  8539.    MouseBuffer Bytes%
  8540.    St$ = SPACE$(Bytes%)
  8541.    MouseSave St$
  8542.  
  8543. -------
  8544. Bytes%     number of bytes needed to save the state of the mouse
  8545.  
  8546. Name  : MouseCursor          (Mouse Cursor type)
  8547. Class : Mouse
  8548. Level : BIOS
  8549.  
  8550. The MouseCursor routine allows you to select one of a number of
  8551. graphics mouse cursors. The following types are supported:
  8552.  
  8553.     0   hourglass ("please wait" symbol)
  8554.     1   standard arrow pointer
  8555.     2   pointing hand
  8556.     3   crosshair
  8557.     4   target (box-in-a-box pointer)
  8558.     5   grabbing hand
  8559.  
  8560. If you'd like other shapes, please suggest a few! I'll be glad
  8561. to add them.
  8562.  
  8563.    MouseCursor CursorNr%
  8564.  
  8565. CursorNr%    type of mouse graphics cursor to use (see above)
  8566.  
  8567. Name  : MousePen             (Mouse light Pen emulation)
  8568. Class : Mouse
  8569. Level : BIOS
  8570.  
  8571. The mouse can be made to emulate a light pen, allowing you to
  8572. use BASIC's light pen routines to provide a certain minimal
  8573. level of support for both light pens and mice. This emulation is
  8574. on by default, but you can turn it off in case there is an
  8575. actual light pen attached.
  8576.  
  8577. This routine will not work properly if there is no mouse
  8578. available. Use the MMCheck routine if you are not sure.
  8579.  
  8580.    MousePen EmulatePen%
  8581.  
  8582. EmulatePen%   whether mouse should emulate light pen (0 no)
  8583.  
  8584. Name  : MouseRest            (Mouse status Restore)
  8585. Class : Mouse
  8586. Level : BIOS
  8587.  
  8588. This routine is for use in conjunction with MouseSave. It allows
  8589. you to restore the mouse settings to a state that was saved in
  8590. the past.
  8591.  
  8592. This routine will not work properly if there is no mouse
  8593. available. Use the MMCheck routine if you are not sure.
  8594.  
  8595.    MouseRest St$
  8596.  
  8597. St$        mouse state to restore
  8598.  
  8599. Name  : MouseSave            (Mouse status Save)
  8600. Class : Mouse
  8601. Level : BIOS
  8602.  
  8603. This one is handy for use in subprograms or when SHELLing to
  8604. other programs that may use the mouse. It allows you to save the
  8605. current mouse settings as a string. To find out how long the
  8606. string should be, use MouseBuffer.
  8607.  
  8608. This routine will not work properly if there is no mouse
  8609. available. Use the MMCheck routine if you are not sure.
  8610.  
  8611.    MouseBuffer Bytes%
  8612.    St$ = SPACE$(Bytes%)
  8613.    MouseSave St$
  8614.  
  8615. -------
  8616. St$        saved mouse state.  Init as shown above.
  8617.  
  8618. Name  : MPrint               (MS-DOS Print)
  8619. Class : Display
  8620. Level : BIOS
  8621.  
  8622. The MPrint routine displays text using mostly DOS services. This
  8623. allows it to handle ANSI codes if an ANSI driver is installed.
  8624. In addition, the output of MPrint is confined to a region of the
  8625. screen that you may select with MWindow. By default, the region
  8626. is 1,1 to 25,80: a full 80x25 text screen.
  8627.  
  8628. Using MPrint is similar to using PRINT followed by a semicolon.
  8629. It does not automatically move to the next line. To do so, you
  8630. must MPrint a carriage return and linefeed: CHR$(13) + CHR$(10).
  8631.  
  8632. To clear the MWindow region, MPrint a formfeed: CHR$(12).
  8633.  
  8634.    MPrint St$
  8635.  
  8636. St$         string to display
  8637.  
  8638. Name  : MulMatI              (Multiply Matrix by Integer)
  8639. Class : Array management
  8640. Level : Any
  8641.  
  8642. This routine multiplies as many elements of an integer array as
  8643. you like by a given number, starting at a specified place in the
  8644. array. If there was a numeric overflow at any point in the
  8645. operation, an error code will be returned.
  8646.  
  8647.    MulMatI DSeg%, DOfs%, Elements%, Value%, ErrCode%
  8648.  
  8649. DSeg%      segment of the array element to start at
  8650. DOfs%      offset of the array element to start at
  8651. Elements%  number of array elements to process
  8652. Value%     value to multiply each array element by
  8653. -------
  8654. ErrCode%   error code: 0 if no error
  8655.  
  8656. Name  : MultiAND             (Multiple AND)
  8657. Class : String
  8658. Level : Any
  8659.  
  8660. The MultiAND routine performs an arithmetic "AND" operation on
  8661. each character in a string.
  8662.  
  8663. Among the varied uses for MultiAND is stripping the high bit
  8664. from characters, as you might want to do in telecommunications
  8665. or in converting WordStar files. In that case, you would use a
  8666. BitMask% of 127.
  8667.  
  8668.    MultiAND St$, BitMask%
  8669.  
  8670. St$        string to process
  8671. BitMask%   bit mask (0-255) with which to AND each character
  8672. -------
  8673. St$        processed string
  8674.  
  8675. Name  : MultiOR              (Multiple OR)
  8676. Class : String
  8677. Level : Any
  8678.  
  8679. The MultiOR routine performs an arithmetic "OR" operation on
  8680. each character in a string.
  8681.  
  8682.    MultiOR St$, BitMask%
  8683.  
  8684. St$        string to process
  8685. BitMask%   bit mask (0-255) with which to OR each character
  8686. -------
  8687. St$        processed string
  8688.  
  8689. Name  : MultiXOR             (Multiple XOR)
  8690. Class : String
  8691. Level : Any
  8692.  
  8693. The MultiXOR routine performs an arithmetic "XOR" operation on
  8694. each character in a string.
  8695.  
  8696.    MultiXOR St$, BitMask%
  8697.  
  8698. St$        string to process
  8699. BitMask%   bit mask (0-255) with which to XOR each character
  8700. -------
  8701. St$        processed string
  8702.  
  8703. Name  : MWindow              (MS-DOS Window)
  8704. Class : Display
  8705. Level : Any
  8706.  
  8707. The MWindow routine works in conjunction with MPrint. It defines
  8708. an area of the screen in which text displayed by MPrint must
  8709. stay. The default window is 1,1 to 25,80.
  8710.  
  8711.    MWindow TopRow%, LeftCol%, BottomRow%, RightCol%
  8712.  
  8713. TopRow%     top row
  8714. LeftCol%    left column
  8715. BottomRow%  bottom row
  8716. RightCol%   right column
  8717.  
  8718. Name  : NameCase             (Name Case)
  8719. Class : String
  8720. Level : Any
  8721.  
  8722. This routine provides a specialized uppercase/lowercase
  8723. converter designed especially for names. It converts the first
  8724. letter in each word in a string to uppercase, with the rest of
  8725. the word being converted to lowercase.
  8726.  
  8727. See also NameCase2, the FUNCTION version of this routine.
  8728.  
  8729.    NameCase St$
  8730.  
  8731. St$         string to process
  8732. -------
  8733. St$         processed string
  8734.  
  8735. Name  : NameCase2$           (Name Case)
  8736. Class : String
  8737. Level : Any
  8738.  
  8739. This routine provides a specialized uppercase/lowercase
  8740. converter designed especially for names. It converts the first
  8741. letter in each word in a string to uppercase, with the rest of
  8742. the word being converted to lowercase.
  8743.  
  8744. See also NameCase, the SUB version of this routine.
  8745.  
  8746.    Result$ = NameCase2$(St$)
  8747.  
  8748. St$         string to process
  8749. -------
  8750. Result$     processed string
  8751.  
  8752. Name  : Num2Phone$           (compressed phone# to string)
  8753. Class : Numeric String
  8754. Level : Any
  8755.  
  8756. This function takes a phone number (as encoded by Phone2Num&)
  8757. and converts it to unformatted string form. Depending on the
  8758. original number, the result may be 4, 7, or 10 characters in
  8759. length. An invalid code will result in a null string.
  8760.  
  8761. NOTE that this function will handle current US-style phone
  8762. numbers. It expects the first three digits of a 10-digit phone
  8763. number to represent an area code, where the middle digit of the
  8764. area code is always either zero or one. This convention is
  8765. expected to change as of 1994 or so, whereupon this function
  8766. will no longer be reliable <sigh>.
  8767.  
  8768.    Result$ = Num2Phone$(PhoneNumber&)
  8769.  
  8770. PhoneNumber&    encoded phone number
  8771. -------
  8772. Result$         phone number ("" if invalid number)
  8773.  
  8774. Name  : NumFormat            (Number Format)
  8775. Class : Numeric
  8776. Level : DOS
  8777.  
  8778. This works just like PRINT USING, but returns the results in a
  8779. string rather than sending them to the display or a file.
  8780.  
  8781. Note that an interaction between QuickBASIC, DOS and some
  8782. networks means that this routine will briefly access the default
  8783. drive. Strange but true.
  8784.  
  8785.    NumFormat Format$, Number#, Result$
  8786.  
  8787. Format$     numeric format
  8788. Number#     number to format
  8789. -------
  8790. Result$     formatted number
  8791.  
  8792. Name  : NumProc              (Numeric Processor)
  8793. Class : Equipment
  8794. Level : Any
  8795.  
  8796. NumProc returns the type of numeric coprocessor installed. I
  8797. haven't tried it with a 80486, but I would guess an 80486 always
  8798. appears to have an 80387 (unless it's one of those brain-damaged
  8799. 80486SX chips).
  8800.  
  8801. Results are returned as follows:
  8802.  
  8803.    0    no math chip
  8804.    1    8087
  8805.    2    80287
  8806.    3    80387
  8807.  
  8808. If anyone can tell me how to better handle a 486 here, I'd
  8809. appreciate it.
  8810.  
  8811.    NumProc ProcType%
  8812.  
  8813. -------
  8814. ProcType%    type of numeric coprocessor (see above)
  8815.  
  8816. Name  : NumProc2%            (Numeric Processor)
  8817. Class : Equipment
  8818. Level : Any
  8819.  
  8820. NumProc2% returns the type of numeric coprocessor installed. I
  8821. haven't tried it with a 80486, but I would guess an 80486 always
  8822. appears to have an 80387 (unless it's one of those brain-damaged
  8823. 80486SX chips).
  8824.  
  8825.  
  8826. Results are returned as follows:
  8827.  
  8828.    0    no math chip
  8829.    1    8087
  8830.    2    80287
  8831.    3    80387
  8832.  
  8833. If anyone can tell me how to better handle a 486 here, I'd
  8834. appreciate it.
  8835.  
  8836.    ProcType% = NumProc2%
  8837.  
  8838. -------
  8839. ProcType%    type of numeric coprocessor (see above)
  8840.  
  8841. Name  : ObjScan              (Object file Scan)
  8842. Class : Disk
  8843. Level : DOS
  8844.  
  8845. This routine returns information about a specified .OBJ file. It
  8846. returns the module name, public names, and external names. The
  8847. module name is generally the name of the original file which was
  8848. compiled to produce the .OBJ file. Public names are the names of
  8849. routines (and sometimes variables) that can be accessed by
  8850. outside programs. External names are the names of routines (and
  8851. variables) that the .OBJ file expects to be provided by outside
  8852. programs.
  8853.  
  8854. External names containing "$", starting with "_" or with
  8855. lowercase characters are screened out to avoid returning a huge
  8856. list of BASIC internal routines. For the same reason, routines
  8857. ending with "QQ" will also be screened out, as will
  8858. STRINGADDRESS, STRINGASSIGN, STRINGLENGTH, and STRINGRELEASE.
  8859. Y'know, it would be nice if Microsoft followed some sort of
  8860. standard for its names.
  8861.  
  8862. The public and external names are returned in string arrays.
  8863. ObjScan will fail with an error code if there is insufficient
  8864. space, so be sure to allow plenty of room. If scanning
  8865. subprograms, a DIM to 30 or 40 elements is probably ample. If
  8866. scanning large programs, you may need to increase the dimensions
  8867. substantially.
  8868.  
  8869. The ObjScan routine can be used as the basis for a simple ".OBJ
  8870. info" utility or for more complex applications, such as library
  8871. management.
  8872.  
  8873.    ObjScan ObjFile$, ModName$, Routine$(), External$(), ErrCode%
  8874.  
  8875. ObjFile$      name of .OBJ file
  8876. -------
  8877. ModName$      module name
  8878. Routine$()    public names
  8879. External$()   external names
  8880. ErrCode%      whether there was an error (0 no)
  8881.  
  8882. Name  : Odd%                 (Odd integer?)
  8883. Class : Numeric
  8884. Level : Any
  8885.  
  8886. This function returns whether an integer is odd. If so, it
  8887. returns -1, otherwise 0.
  8888.  
  8889.    Result% = Odd%(Number%)
  8890.  
  8891. Number%    number to test
  8892. -------
  8893. Result%    whether the number is odd
  8894.  
  8895. Name  : OddL%                 (Odd Long integer?)
  8896. Class : Numeric
  8897. Level : Any
  8898.  
  8899. This function returns whether a long integer is odd. If so, it
  8900. returns -1, otherwise 0.
  8901.  
  8902.    Result% = Odd%(Number&)
  8903.  
  8904. Number&    number to test
  8905. -------
  8906. Result%    whether the number is odd
  8907.  
  8908. Name  : OrSt                 (OR String)
  8909. Class : String
  8910. Level : Any
  8911.  
  8912. This routine ORs each byte in one string with the corresponding
  8913. byte in a second string. The strings must be the same length.
  8914.  
  8915.    OrSt St1$, St2$
  8916.  
  8917. St1$      string to OR
  8918. St2$      string to OR with
  8919. -------
  8920. St1$      result
  8921.  
  8922. Name  : ParseFSpec           (Parse File Specification)
  8923. Class : Disk
  8924. Level : Any
  8925.  
  8926. This routine splits a file specification into a drive,
  8927. subdirectory, and filename. You are expected to initialize the
  8928. return strings to reasonable values beforehand (1 for drive, 64
  8929. for subdirectory, 12 for filename). If the filespec may be
  8930. invalid, you may wish to leave additional space to avoid
  8931. potentially disastrous overflows. An alternative would be to use
  8932. ExtendFSpec beforehand to check and complete the file
  8933. specification. This is likely to be a good approach anyway--
  8934. these two routines complement each other nicely.
  8935.  
  8936.    Drive$ = SPACE$(1)
  8937.    Subdir$ = SPACE$(64)
  8938.    File$ = SPACE$(12)
  8939.    ParseFSpec FileSpec$, Drive$, DLen%, Subdir$, SLen%,
  8940.       File$, FLen%
  8941.    Drive$ = LEFT$(Drive$, DLen%)
  8942.    Subdir$ = LEFT$(Subdir$, SLen%)
  8943.    File$ = LEFT$(File$, FLen%)
  8944.  
  8945. FileSpec$   file specification
  8946. -------
  8947. Drive$      drive letter (init to 1+)
  8948. DLen%       length of Drive$
  8949. SubDir$     subdirectory (init to 64+)
  8950. SLen%       length of Subdir$
  8951. File$       file name (init to 12+)
  8952. FLen%       length of File$
  8953.  
  8954. Name  : PatchDone            (Patch Done)
  8955. Class : Disk
  8956. Level : DOS
  8957.  
  8958. This routine closes the file opened by FindPatch. You must use
  8959. PatchDone when you are finished patching the file.
  8960.  
  8961. Routines in this set include FindPatch, SetPatch, and PatchDone.
  8962.  
  8963.    PatchDone
  8964.  
  8965. Name  : PCDat$               (PC Date)
  8966. Class : Equipment
  8967. Level : Clone
  8968.  
  8969. The PCDat$ routine tells you the date of the BIOS ROM chip. This
  8970. date is not always available on some (mostly older) clones, in
  8971. which case "No Date" is returned.
  8972.  
  8973.    ROMDate$ = PCDat$
  8974.  
  8975. -------
  8976. ROMDate$   date of the BIOS ROM (xx/xx/xx).
  8977.  
  8978. Name  : PCDate               (PC Date)
  8979. Class : Equipment
  8980. Level : Clone
  8981.  
  8982. The PCDate routine tells you the date of the BIOS ROM chip. This
  8983. date is not always available on some (mostly older) clones, in
  8984. which case "No Date " is returned. See also PCDat, a function
  8985. version of this routine.
  8986.  
  8987.    ROMDate$ = SPACE$(8)
  8988.    PCDate ROMDate$
  8989.  
  8990. -------
  8991. ROMDate$   date of the BIOS ROM (xx/xx/xx).  Init to 8+ chars.
  8992.  
  8993. Name  : PCType               (PC Type)
  8994. Class : Equipment
  8995. Level : Clone
  8996.  
  8997. This routine returns the machine I.D. code. This code may not be
  8998. one of the listed values for some (mostly older) clones, but the
  8999. following is usually correct:
  9000.  
  9001.    I.D.  ....Machine....
  9002.    255   PC or XT
  9003.    254   XT
  9004.    253   PCjr
  9005.    252   PC AT
  9006.    251   XT
  9007.    250   PS/2 Model 30
  9008.    249   PC Convertible
  9009.    248   PS/2 Model 70 or 80
  9010.    154   Compaq Portable
  9011.     45   Compaq Portable
  9012.  
  9013. Note that, for identification purposes, a PC and XT are
  9014. essentially the same. The XT is simply a PC with an auto-boot
  9015. hard drive. New I.D. numbers come out more or less at random
  9016. from IBM, although they aren't as capricious about it as they
  9017. used to be. It is useful to identify Compaq Portables as
  9018. separate from PCs because those machines had an unusual display,
  9019. which acts like a CGA but has the resolution (in text modes) of
  9020. an MDA. Hence, the cursor size of a Compaq Portable is MDA-sized
  9021. in text mode, but CGA-sized in graphics modes, even though
  9022. ordinary tests will tell your program that a CGA is attached. If
  9023. you intend to alter the cursor size, this is an important
  9024. distinction, since the Compaq Portable was a great success and
  9025. is still in wide use. Current Compaq machines, like most other
  9026. clones, follow the standard IBM I.D. codes.
  9027.  
  9028. See also PCType2, a function version of this routine.
  9029.  
  9030.    PCType MachineID%
  9031.  
  9032. -------
  9033. MachineID%   type of computer
  9034.  
  9035. Name  : PCType2%             (PC Type)
  9036. Class : Equipment
  9037. Level : Clone
  9038.  
  9039. This routine returns the machine I.D. code. This code may not be
  9040. one of the listed values for some (mostly older) clones, but the
  9041. following is usually correct:
  9042.  
  9043.    I.D.  ....Machine....
  9044.    255   PC or XT
  9045.    254   XT
  9046.    253   PCjr
  9047.    252   PC AT
  9048.    251   XT
  9049.    250   PS/2 Model 30
  9050.    249   PC Convertible
  9051.    248   PS/2 Model 70 or 80
  9052.    154   Compaq Portable
  9053.     45   Compaq Portable
  9054.  
  9055. Note that, for identification purposes, a PC and XT are
  9056. essentially the same. The XT is simply a PC with an auto-boot
  9057. hard drive. New I.D. numbers come out more or less at random
  9058. from IBM, although they aren't as capricious about it as they
  9059. used to be. It is useful to identify Compaq Portables as
  9060. separate from PCs because those machines had an unusual display,
  9061. which acts like a CGA but has the resolution (in text modes) of
  9062. an MDA. Hence, the cursor size of a Compaq Portable is MDA-sized
  9063. in text mode, but CGA-sized in graphics modes, even though
  9064. ordinary tests will tell your program that a CGA is attached. If
  9065. you intend to alter the cursor size, this is an important
  9066. distinction, since the Compaq Portable was a great success and
  9067. is still in wide use. Current Compaq machines, like most other
  9068. clones, follow the standard IBM I.D. codes.
  9069.  
  9070.    MachineID% = PCType2%
  9071.  
  9072. -------
  9073. MachineID%   type of computer
  9074.  
  9075. Name  : Phone2Num&           (Phone# to Number)
  9076. Class : Numeric String
  9077. Level : Any
  9078.  
  9079. This function converts a U.S. or Canadian phone number from
  9080. string form to a long integer. It accepts phone numbers of 4, 7,
  9081. 10, or 11 digits. If there are 11 digits, the first digit must
  9082. be a 1. Non-numeric characters are ignored so that formatted
  9083. phone numbers can be used. If the phone number is of the wrong
  9084. length or otherwise does not appear to be valid, -1 is returned;
  9085. otherwise, the result is a long integer which represents the
  9086. phone number in a format that can be decoded by Num2Phone$.
  9087.  
  9088. This function will accept alphabetic phone numbers and convert
  9089. them to their numeric equivalents.
  9090.  
  9091. Since it only takes 4 bytes to store a long integer, as opposed
  9092. to 7 to 10 or more for the usual alphanumeric form, this can be
  9093. considered a compression routine as well as a validation
  9094. routine. At worst, for 4-digit phone numbers, it is exactly as
  9095. efficient as a character representation. For 7 or 10-digit phone
  9096. numbers, it roughly doubles your storage space.
  9097.  
  9098. A few words on how checking is done: obviously, there is no way
  9099. to tell whether a number is in use or is in fact whoever you
  9100. wished to call. However, there are certain regularities to
  9101. numeric phone numbers which can be used to detect blatantly
  9102. false numbers. Alphabetic phone numbers do not include all the
  9103. letters of the alphabet, either. This routine will check for any
  9104. obvious peculiarities and warn you accordingly.
  9105.  
  9106. NOTE that this function will handle current US-style phone
  9107. numbers. It expects the first three digits of a 10-digit phone
  9108. number to represent an area code, where the middle digit of the
  9109. area code is always either zero or one. This convention is
  9110. expected to change as of 1994 or so, whereupon this function
  9111. will no longer be reliable <sigh>.
  9112.  
  9113.    Result& = Phone2Num&(PhoneNumber$)
  9114.  
  9115. PhoneNumber$    phone number (may be formatted)
  9116. -------
  9117. Result&         encoded phone number (-1 if invalid number)
  9118.  
  9119. Name  : PrintBox             (Print a Box)
  9120. Class : Display
  9121. Level : Clone
  9122.  
  9123. This routine displays a box, filled with a character or string
  9124. of your choice. Only text modes are supported.
  9125.  
  9126.    PrintBox St$, TopRow%, LftCol%, BotRow%, RhtCol%, VAttr%, _
  9127.      Page%, Fast%
  9128.  
  9129. St$        string to fill box with (one or more chars)
  9130. TopRow%    top row of box
  9131. LftCol%    left column of box
  9132. BotRow%    bottom row of box
  9133. RhtCol%    right column of box
  9134. VAttr%     color/attribute of box (see CalcAttr)
  9135. Page%      display page (for color adapters)
  9136. Fast%      display speed (-1 fast, 0 slow for old CGAs)
  9137.  
  9138. Name  : PrinterInit          (Printer Initialize)
  9139. Class : Printer
  9140. Level : BIOS
  9141.  
  9142. This routine initializes a printer in the same way as if the
  9143. computer had been rebooted.
  9144.  
  9145. Note that this will not work on serial printers, even if the
  9146. MODE command was used to redirect the port. It works at the BIOS
  9147. level, so it doesn't know about any fooling around DOS does.
  9148.  
  9149.    PrinterInit Port%
  9150.  
  9151. Port%         parallel port number (1-3)
  9152.  
  9153. Name  : PrinterReady%        (Printer Ready)
  9154. Class : Printer
  9155. Level : BIOS
  9156.  
  9157. This function lets you know if a printer is ready. It checks to
  9158. make sure that the specified port exists, then makes sure a
  9159. printer is connected, turned on, and has paper in it.
  9160.  
  9161. Note that this will not work on serial printers, even if the
  9162. MODE command was used to redirect the port. It works at the BIOS
  9163. level, so it doesn't know about any fooling around DOS does.
  9164.  
  9165.    Ready% = PrinterReady%(Port%)
  9166.  
  9167. Port%         parallel port number (1-3)
  9168. -------
  9169. Ready%        whether there's a printer ready at that port
  9170.  
  9171. Name  : PrintFile            (Print File)
  9172. Class : Printer
  9173. Level : DOS
  9174.  
  9175. This routine sends a file to the printer. It does not paginate,
  9176. spool, or anything else fancy. The LPT1 or PRN device is used by
  9177. default, although you can change this using the PrtSwap routine.
  9178.  
  9179. The predefined device handle for stdprn is used, so don't use
  9180. FClose1 to free that handle if you expect to use this routine.
  9181. The results could be nasty.
  9182.  
  9183.    PrintFile FileName$, ErrCode%
  9184.  
  9185. FileName$     name of the file to print
  9186. -------
  9187. ErrCode%      whether there was an error (0 no, else DOS Error)
  9188.  
  9189. Name  : PrintScreen          (Print Screen)
  9190. Class : Display / Printer
  9191. Level : BIOS
  9192.  
  9193. Just like pressing the PrtSc/PrintScrn key on the keyboard, this
  9194. routine sends the contents of the display to the printer. It is
  9195. mostly designed for text modes, but use of the GRAPHICS TSR
  9196. provided with DOS will allow it to print out CGA graphics
  9197. displays as well. For some reason, the GRAPHICS utility does not
  9198. handle Hercules, EGA or VGA displays; however, alternative
  9199. utilities which provide such features may be obtained from your
  9200. local BBS.
  9201.  
  9202.    PrintScreen
  9203.  
  9204. Name  : Processor            (Processor)
  9205. Class : Equipment
  9206. Level : Any
  9207.  
  9208. Processor returns the type of processor (CPU) installed.
  9209.  
  9210. Results are returned as follows:
  9211.  
  9212.    0    NEC V20
  9213.    1    8088 or 8086
  9214.    2    80186
  9215.    3    80286
  9216.    4    80386
  9217.    5    80486
  9218.  
  9219. Note that, for most practical purposes, a NEC V20 works just
  9220. like an 80186.
  9221.  
  9222.    Processor ProcType%
  9223.  
  9224. -------
  9225. ProcType%    type of CPU (see above)
  9226.  
  9227. Name  : Processor2%          (Processor)
  9228. Class : Equipment
  9229. Level : Any
  9230.  
  9231. Processor returns the type of processor (CPU) installed.
  9232.  
  9233. Results are returned as follows:
  9234.  
  9235.    0    NEC V20
  9236.    1    8088 or 8086
  9237.    2    80186
  9238.    3    80286
  9239.    4    80386
  9240.    5    80486
  9241.  
  9242. Note that, for most practical purposes, a NEC V20 works just
  9243. like an 80186.
  9244.  
  9245.    ProcType% = Processor2%
  9246.  
  9247. -------
  9248. ProcType%    type of CPU (see above)
  9249.  
  9250. Name  : PrtSc                (Print Screen key)
  9251. Class : Input / Printer
  9252. Level : BIOS
  9253.  
  9254. This routine allows you to disable the "print screen" key. This
  9255. only affects the keyboard, not the PrintScreen routine in
  9256. PBClone.
  9257.  
  9258. When the print screen key is disabled, you can detect whether it
  9259. was pressed using the GetPrtSc% function. This provides a way of
  9260. using the key for your own purposes.
  9261.  
  9262. If you disable the print screen key, be sure to enable it again
  9263. before your program ends. Otherwise, the print screen key will
  9264. be left in an undefined state, probably causing the computer to
  9265. crash when it is next pressed.
  9266.  
  9267.    PrtSc Enable%
  9268.  
  9269. Enable%   whether print screen key should be enabled (0 if no)
  9270.  
  9271. Name  : PrtSwap              (Printer Swap)
  9272. Class : Printer
  9273. Level : Clone
  9274.  
  9275. It's handy to use LPRINT, but it isn't always practical. LPRINT
  9276. only works on the first printer available (PRN or LPT1). With
  9277. this routine, it doesn't matter. PrtSwap allows you to swap any
  9278. two printer ports.
  9279.  
  9280. Note that it's a good idea to swap the ports back to their
  9281. original locations before exiting your program. You could cause
  9282. major confusion otherwise!
  9283.  
  9284.    PrtSwap Port1%, Port2%
  9285.  
  9286. Port1%    number of the first port (1-3)
  9287. Port2%    number of the second port (1-3)
  9288.  
  9289. Name  : PSortD               (Pointer Sort Double precision)
  9290. Class : Array management
  9291. Level : Any
  9292.  
  9293. This routine sorts the elements in a double precision array...
  9294. well, actually, it doesn't change the position of anything in
  9295. the double precision array. It sorts the array using a set of
  9296. pointers to the array. You can then use the pointers to refer to
  9297. the array or to re-order the array yourself.
  9298.  
  9299. Why bother with pointers? Well, it's a lot faster than sorting
  9300. the numbers directly, since less information has to be swapped.
  9301. It has another major advantage, though-- it allows you to sort
  9302. an array without losing track of how it corresponds to any
  9303. related arrays.
  9304.  
  9305. The array is assumed to start at element 1. You may specify the
  9306. last element in the array, allowing you to sort only part of an
  9307. array if you like.
  9308.  
  9309. The pointer array must be initialized so that each element is
  9310. equal to its index. Either use InitPtr or do:
  9311.    FOR tmp% = 1 TO Elements%
  9312.       Ptr%(tmp%) = tmp%
  9313.    NEXT
  9314.  
  9315. After this routine, you can access the sorted array via the
  9316. pointer array. For instance, to print out a sorted double
  9317. precision array, you'd use:
  9318.    FOR tmp% = 1 TO Elements%
  9319.       PRINT Array#(Ptr%(tmp%))
  9320.    NEXT
  9321.  
  9322. If you would like the results to be last-to-first, rather than
  9323. first-to-last, just call ReverseI to reverse the pointer array
  9324. (after this routine).
  9325.  
  9326.    PSortD Ptr%(), Array#(), Elements%
  9327.  
  9328. Ptr%()      pointers to array to be sorted
  9329. Array#()    array to be sorted
  9330. Elements%   number of elements in array
  9331. -------
  9332. Ptr%()      pointers which allow accessing array in sorted order
  9333.  
  9334. Name  : PSortI               (Pointer Sort Integer)
  9335. Class : Array management
  9336. Level : Any
  9337.  
  9338. This routine sorts the elements in an integer array... well,
  9339. actually, it doesn't change the position of anything in the
  9340. integer array. It sorts the array using a set of pointers to the
  9341. array. You can then use the pointers to refer to the array or to
  9342. re-order the array yourself.
  9343.  
  9344. Why bother with pointers? It has a major advantage-- it allows
  9345. you to sort an array without losing track of how it corresponds
  9346. to any related arrays.
  9347.  
  9348. The array is assumed to start at element 1. You may specify the
  9349. last element in the array, allowing you to sort only part of an
  9350. array if you like.
  9351.  
  9352. The pointer array must be initialized so that each element is
  9353. equal to its index. Either use InitPtr or do:
  9354.    FOR tmp% = 1 TO Elements%
  9355.       Ptr%(tmp%) = tmp%
  9356.    NEXT
  9357.  
  9358. After this routine, you can access the sorted array via the
  9359. pointer array. For instance, to print out a sorted integer
  9360. array, you'd use:
  9361.    FOR tmp% = 1 TO Elements%
  9362.       PRINT Array%(Ptr%(tmp%))
  9363.    NEXT
  9364.  
  9365. If you would like the results to be last-to-first, rather than
  9366. first-to-last, just call ReverseI to reverse the pointer array
  9367. (after this routine).
  9368.  
  9369.    PSortI Ptr%(), Array%(), Elements%
  9370.  
  9371. Ptr%()      pointers to array to be sorted
  9372. Array%()    array to be sorted
  9373. Elements%   number of elements in array
  9374. -------
  9375. Ptr%()      pointers which allow accessing array in sorted order
  9376.  
  9377. Name  : PSortL               (Pointer Sort Long integer)
  9378. Class : Array management
  9379. Level : Any
  9380.  
  9381. This routine sorts the elements in a long integer array... well,
  9382. actually, it doesn't change the position of anything in the long
  9383. integer array. It sorts the array using a set of pointers to the
  9384. array. You can then use the pointers to refer to the array or to
  9385. re-order the array yourself.
  9386.  
  9387. Why bother with pointers? Well, it's a lot faster than sorting
  9388. the numbers directly, since less information has to be swapped.
  9389. It has another major advantage, though-- it allows you to sort
  9390. an array without losing track of how it corresponds to any
  9391. related arrays.
  9392.  
  9393. The array is assumed to start at element 1. You may specify the
  9394. last element in the array, allowing you to sort only part of an
  9395. array if you like.
  9396.  
  9397. The pointer array must be initialized so that each element is
  9398. equal to its index. Either use InitPtr or do:
  9399.    FOR tmp% = 1 TO Elements%
  9400.       Ptr%(tmp%) = tmp%
  9401.    NEXT
  9402.  
  9403. After this routine, you can access the sorted array via the
  9404. pointer array. For instance, to print out a sorted long integer
  9405. array, you'd use:
  9406.    FOR tmp% = 1 TO Elements%
  9407.       PRINT Array&(Ptr%(tmp%))
  9408.    NEXT
  9409.  
  9410. If you would like the results to be last-to-first, rather than
  9411. first-to-last, just call ReverseI to reverse the pointer array
  9412. (after this routine).
  9413.  
  9414.    PSortL Ptr%(), Array&(), Elements%
  9415.  
  9416. Ptr%()      pointers to array to be sorted
  9417. Array&()    array to be sorted
  9418. Elements%   number of elements in array
  9419. -------
  9420. Ptr%()      pointers which allow accessing array in sorted order
  9421.  
  9422. Name  : PSortS               (Pointer Sort Single precision)
  9423. Class : Array management
  9424. Level : Any
  9425.  
  9426. This routine sorts the elements in a single precision array...
  9427. well, actually, it doesn't change the position of anything in
  9428. the single precision array. It sorts the array using a set of
  9429. pointers to the array. You can then use the pointers to refer to
  9430. the array or to re-order the array yourself.
  9431.  
  9432. Why bother with pointers? Well, it's a lot faster than sorting
  9433. the numbers directly, since less information has to be swapped.
  9434. It has another major advantage, though-- it allows you to sort
  9435. an array without losing track of how it corresponds to any
  9436. related arrays.
  9437.  
  9438. The array is assumed to start at element 1. You may specify the
  9439. last element in the array, allowing you to sort only part of an
  9440. array if you like.
  9441.  
  9442. The pointer array must be initialized so that each element is
  9443. equal to its index. Either use InitPtr or do:
  9444.    FOR tmp% = 1 TO Elements%
  9445.       Ptr%(tmp%) = tmp%
  9446.    NEXT
  9447.  
  9448. After this routine, you can access the sorted array via the
  9449. pointer array. For instance, to print out a sorted single
  9450. precision array, you'd use:
  9451.    FOR tmp% = 1 TO Elements%
  9452.       PRINT Array!(Ptr%(tmp%))
  9453.    NEXT
  9454.  
  9455. If you would like the results to be last-to-first, rather than
  9456. first-to-last, just call ReverseI to reverse the pointer array
  9457. (after this routine).
  9458.  
  9459.    PSortS Ptr%(), Array!(), Elements%
  9460.  
  9461. Ptr%()      pointers to array to be sorted
  9462. Array!()    array to be sorted
  9463. Elements%   number of elements in array
  9464. -------
  9465. Ptr%()      pointers which allow accessing array in sorted order
  9466.  
  9467. Name  : PSortSt              (Pointer Sort String)
  9468. Class : Array management
  9469. Level : Any
  9470.  
  9471. This routine sorts the elements in a string array... well,
  9472. actually, it doesn't change the position of anything in the
  9473. string array. It sorts the array using a set of pointers to the
  9474. array. You can then use the pointers to refer to the array or to
  9475. re-order the array yourself.
  9476.  
  9477. Why bother with pointers? Well, it's a lot faster than sorting
  9478. the strings directly, since less information has to be swapped.
  9479. It has another major advantage, though-- it allows you to sort
  9480. an array without losing track of how it corresponds to any
  9481. related arrays. For instance, if you have one array holding
  9482. names and another holding phone numbers, this allows you to sort
  9483. on names without losing track of which phone numbers are which.
  9484.  
  9485. The array is assumed to start at element 1. You may specify the
  9486. last element in the array, allowing you to sort only part of an
  9487. array if you like. You can also specify whether the
  9488. capitalization of letters in a string should matter for sorting
  9489. purposes.
  9490.  
  9491. The pointer array must be initialized so that each element is
  9492. equal to its index. Either use InitPtr or do:
  9493.    FOR tmp% = 1 TO Elements%
  9494.       Ptr%(tmp%) = tmp%
  9495.    NEXT
  9496.  
  9497. After this routine, you can access the sorted array via the
  9498. pointer array. For instance, to print out a sorted string array,
  9499. you'd use:
  9500.    FOR tmp% = 1 TO Elements%
  9501.       PRINT Array$(Ptr%(tmp%))
  9502.    NEXT
  9503.  
  9504. If you would like the results to be last-to-first, rather than
  9505. first-to-last, just call ReverseI to reverse the pointer array
  9506. (after this routine).
  9507.  
  9508.    PSortSt Ptr%(), Array$(), Elements%, CapsCount%
  9509.  
  9510. Ptr%()      pointers to array to be sorted
  9511. Array$()    array to be sorted
  9512. CapsCount%  use 0 if uppercase/lowercase distinctions don't matter
  9513. Elements%   number of elements in array
  9514. -------
  9515. Ptr%()      pointers which allow accessing array in sorted order
  9516.  
  9517. Name  : PutScreen            (Put Screen)
  9518. Class : Display
  9519. Level : Clone
  9520.  
  9521. This routine restores a portion of the display (which was saved
  9522. to an array by DGetScreen or GetScreen) to the screen. Only text
  9523. modes are supported. If your program uses multiple display
  9524. pages, you can put the image onto any of those pages. A special
  9525. "slow" mode is supported for the CGA, to prevent flickering (a
  9526. problem only with some CGAs).
  9527.  
  9528. If you wish to restore the entire screen, you may find ScrRest
  9529. easier (see).
  9530.  
  9531.    PutScreen Array%(), TRow%, LCol%, BRow%, RCol%, Page%, Fast%
  9532.  
  9533. Array%()   array from which to restore the image
  9534. TRow%      top row of the desired screen area
  9535. LCol%      left column of the desired screen area
  9536. BRow%      bottom row of the desired screen area
  9537. RCol%      right column of the desired screen area
  9538. Page%      page on which to restore the display
  9539. Fast%      whether to use fast mode (0 no)
  9540.  
  9541. Name  : QPrint               (Quick Print)
  9542. Class : Display
  9543. Level : Clone
  9544.  
  9545. This is a replacement for the PRINT statement. It is less
  9546. flexible in that it does not move the cursor or interpret
  9547. control codes, and because it uses the color that is already on
  9548. the screen instead of a specified color value. It also works
  9549. only in text modes.
  9550.  
  9551. In exchange, QPrint gives you much faster display speeds.
  9552.  
  9553. See also XQPrint, which is a bit more flexible (and somewhat
  9554. slower).
  9555.  
  9556. The results of this routine are not redirectable by DOS.
  9557.  
  9558.    QPrint St$, Row%, Column%, Page%, Fast%
  9559.  
  9560. St$        text to display
  9561. Row%       starting row
  9562. Column%    starting column
  9563. Page%      page on which to display
  9564. Fast%      whether to use fast mode (0 no)
  9565.  
  9566. Name  : Rand%                (Random number)
  9567. Class : Numeric
  9568. Level : Clone
  9569.  
  9570. This is a pseudo-random number function. It returns a "random"
  9571. number in a range you specify (e.g., if you pass it 10, it will
  9572. return 0-9). The number is less random than you'd get from the
  9573. BASIC function RND, and you can't set a random number seed a la
  9574. RANDOMIZE. There is one major advantage to Rand%, however: it
  9575. doesn't bring in BASIC's floating point support, which makes it
  9576. much faster than RND and may make your program much smaller.
  9577.  
  9578. See also RndI%, which is based on RND itself.
  9579.  
  9580.    Number% = Rand%(Range%)
  9581.  
  9582. Range%      range of desired pseudo-random number
  9583. -------
  9584. Number%     pseudo-random number from 0 to Range% - 1
  9585.  
  9586. Name  : RandFile$            (Random Filename)
  9587. Class : File
  9588. Level : DOS
  9589.  
  9590. This function returns a pseudo-random filename. The returned
  9591. string is based on the current time, to hundredths of a second,
  9592. and will be a dollar sign followed by up to seven characters and
  9593. digits, terminated by a space. This leaves you room to add your
  9594. own file extension, if you like.
  9595.  
  9596. The anticipated use for this function is creating temporary
  9597. files which will be used for a brief time by your program before
  9598. being deleted. The filename returned will be rather unlikely to
  9599. conflict with any existing files.
  9600.  
  9601.    FileName$ = RandFile$
  9602.  
  9603. -------
  9604. FileName$    pseudo-random filename (e.g., "$P382227.")
  9605.  
  9606. Name  : RClickLoc            (Right Click Location)
  9607. Class : Mouse
  9608. Level : BIOS
  9609.  
  9610. This routine returns the position of the mouse cursor at the
  9611. last click of the right mouse button. It must be used after one
  9612. of the routines which check for mouse clicks, as they maintain
  9613. the click position. These routines include GetKey, GetKey3,
  9614. MMClick, and MMClick3.
  9615.  
  9616. The values returned are in graphics coordinates (virtual
  9617. coordinates for SCREEN 0 through SCREEN 2, due to the nature of
  9618. the mouse driver).
  9619.  
  9620.    RClickLoc X%, Y%
  9621.  
  9622. -------
  9623. X%         horizontal coordinate at last right click
  9624. Y%         vertical coordinate at last right click
  9625.  
  9626. Name  : ReadBitF             (Read Bit Field)
  9627. Class : Numeric
  9628. Level : Any
  9629.  
  9630. This routine allows you to get an element of a virtual array.
  9631. The actual array can be any numeric type, as it is just being
  9632. used as a storage area. The virtual array is composed of numbers
  9633. of a bit length that you specify (1-8). This provides efficient
  9634. storage for numbers which have a limited range.
  9635.  
  9636. See also WriteBitF.
  9637.  
  9638.    ReadBitF DSeg%, DOfs%, ElementNr&, BitLen%, Value%
  9639.  
  9640. DSeg%        segment of actual array
  9641. DOfs%        offset of actual array
  9642. ElementNr&   virtual element number (starts at 0)
  9643. BitLen%      bits per virtual element (1-8)
  9644. -------
  9645. Value%       result (0-255 or less, depending on BitLen%)
  9646.  
  9647. Name  : ReadScreen           (Read Screen into string)
  9648. Class : Display
  9649. Level : Clone
  9650.  
  9651. This routine reads a string off the screen. The screen must be
  9652. in text mode.
  9653.  
  9654. See also GetLine, which reads a row of text from a virtual or
  9655. saved screen.
  9656.  
  9657.    Result$ = SPACE$(10)    ' init to desired length
  9658.    ReadScreen Result$, Row%, Column%, Page%
  9659.  
  9660. Result$      result string: init to desired length first
  9661. Row%         row (1-25, 1-43, etc [depends on screen mode])
  9662. Column%      column (1-40, 1-80, etc [depends on mode])
  9663. Page%        page (0, 0-3, etc [depends on display and mode])
  9664.  
  9665. Name  : Reboot               (Reboot)
  9666. Class : Miscellaneous
  9667. Level : Clone
  9668.  
  9669. This routine restarts the computer, just like typing
  9670. Control-Alt-Del at the keyboard.
  9671.  
  9672.    Reboot
  9673.  
  9674. Name  : Recolor              (Recolor)
  9675. Class : Display
  9676. Level : Clone
  9677.  
  9678. The Recolor routine changes all text in one color to another
  9679. color. It works only in text modes. The colors are specified as
  9680. attributes (see CalcAttr).
  9681.  
  9682.    Recolor OldAttr%, NewAttr%
  9683.  
  9684. OldAttr%   color to be changed
  9685. NewAttr%   color to which to change
  9686.  
  9687. Name  : RecolorArea          (Recolor Area)
  9688. Class : Display
  9689. Level : Clone
  9690.  
  9691. The RecolorArea routine changes a specified area of the screen
  9692. to a specified color. It works only in text modes. The color is
  9693. specified as an attribute (see CalcAttr).
  9694.  
  9695. See also HiLite, which provides an easier way of highlighting
  9696. between two columns on a single row.
  9697.  
  9698.    RecolorArea TRow%, LCol%, BRow%, RCol%, VAttr%, Page%, Fast%
  9699.  
  9700. TRow%       top row of area to recolor
  9701. LCol%       left column of area to recolor
  9702. BRow%       bottom row of area to recolor
  9703. RCol%       right column of area to recolor
  9704. VAttr%      desired color
  9705. Page%       display page (normally zero)
  9706. Fast%       whether to use fast mode (0 no)
  9707.  
  9708. Name  : RedirectIn%          (Redirect Input)
  9709. Class : Miscellaneous
  9710. Level : DOS
  9711.  
  9712. The RedirectIn% function allows you to determine whether input
  9713. has been redirected. This lets you know whether input is coming
  9714. from the keyboard or from a file or device.
  9715.  
  9716. Input that is done by BIOS key routines (e.g., BIOSInkey) is not
  9717. affected by redirection, so if you want to support redirection
  9718. it is best to avoid such routines unless there is something that
  9719. must come from the keyboard.
  9720.  
  9721.    Redir% = RedirectIn%
  9722.  
  9723. -------
  9724. Redir%     whether input has been redirected (0 no)
  9725.  
  9726. Name  : RedirectOut%         (Redirect Output)
  9727. Class : Miscellaneous
  9728. Level : DOS
  9729.  
  9730. The RedirectOut% function allows you to determine whether output
  9731. has been redirected. This lets you know whether output is going
  9732. to the display or to a file or device.
  9733.  
  9734. Output that is done by direct screen writes (e.g., XQPrint) is
  9735. not affected by redirection, so if you want to allow redirection
  9736. it is best to avoid such routines unless there is something that
  9737. must to go to the screen itself.
  9738.  
  9739.    Redir% = RedirectOut%
  9740.  
  9741. -------
  9742. Redir%     whether output has been redirected (0 no)
  9743.  
  9744. Name  : Rename               (Rename file)
  9745. Class : Disk
  9746. Level : DOS
  9747.  
  9748. This routine allows you to rename an ordinary file. See also
  9749. RenSub.
  9750.  
  9751.    Rename CurrentName$, NewName$, ErrCode%
  9752.  
  9753. CurrentName$   current name of the file
  9754. NewName$       desired name of the file
  9755. -------
  9756. ErrCode%       error code: 0 if no error, else DOS Error
  9757.  
  9758. Name  : RenSub               (Rename Subdirectory)
  9759. Class : Disk
  9760. Level : DOS
  9761.  
  9762. This routine provides a service that was inexplicably left out
  9763. of the DOS command shell. It allows you to rename a
  9764. subdirectory.
  9765.  
  9766. Note that renaming a subdirectory is only possible using
  9767. old-style FCB file handling. This means that the subdirectory
  9768. which you specify must be in the current directory (the routine
  9769. doesn't really understand subdirectories per se, but treats them
  9770. like any other file). In this implementation, no drive
  9771. specification is allowed either. Finally, if there is an error,
  9772. the error code may be a simple "255" instead of a useful disk
  9773. error number.
  9774.  
  9775.    RenSub CurrentSub$, NewSub$, ErrCode%
  9776.  
  9777. CurrentSub$   current name of the subdirectory
  9778. NewSub$       desired name of the subdirectory
  9779. -------
  9780. ErrCode%      error code: 0 if no error, else DOS Error
  9781.  
  9782. Name  : Replace              (Replace character)
  9783. Class : String
  9784. Level : Any
  9785.  
  9786. This routine replaces all occurrences of a given character in a
  9787. string with another character.
  9788.  
  9789.    Replace St$, CurCh$, NewCh$
  9790.  
  9791. St$         string to process
  9792. CurCh$      character to be replaced
  9793. NewCh$      character to replace with
  9794. -------
  9795. St$         processed string
  9796.  
  9797. Name  : ReplaceString        (Replace String)
  9798. Class : String
  9799. Level : Any
  9800.  
  9801. This routine replaces all occurrences of a given substring
  9802. within a string with another substring. The substrings may be of
  9803. any length.
  9804.  
  9805. An error code will be returned if the string to search for is
  9806. null.
  9807.  
  9808.    ReplaceString St$, Old$, New$, Found%, ErrCode%
  9809.  
  9810. St$         string to process
  9811. Old$        substring to be replaced
  9812. New$        substring to replace with
  9813. -------
  9814. Found%      whether a replacement was done (0 if no)
  9815. ErrCode%    whether there was an error (0 if no)
  9816.  
  9817. Name  : Retries              (Retries)
  9818. Class : Disk
  9819. Level : DOS 3.1+
  9820.  
  9821. This routine allows you to adjust the handling of file-sharing
  9822. errors. When such an error occurs, DOS normally retries 3 times,
  9823. with a wait of 1 between tries. This allows temporary
  9824. conditions, such as someone else using the file you want to
  9825. access, to clear up. In many cases, though, you may want to
  9826. change this delay. A shorter delay will improve response time,
  9827. allowing your program to handle the error more quickly. A longer
  9828. delay may be more suited for a busy network, allowing the
  9829. request to proceed after a reasonable waiting period.
  9830.  
  9831. The delay period between each retry is unfortunately
  9832. machine-dependent, i.e., you will need larger delays on faster
  9833. machines to achieve the same effect. This can only be considered
  9834. a flaw in DOS.
  9835.  
  9836. Note that shorter waiting periods will improve response time for
  9837. your program, but may adversely affect the network. Normally,
  9838. you should use the longest waiting period with which you feel
  9839. comfortable.
  9840.  
  9841.    Retries Times%, WaitTime%
  9842.  
  9843. Times%     # of times to retry if file-sharing violation occurs
  9844. WaitTime%  amount of time to delay between retries
  9845.  
  9846. Name  : Reverse              (Reverse)
  9847. Class : String
  9848. Level : Any
  9849.  
  9850. This little fellow reverses the order of the characters in a
  9851. string. It is one of the vital components of RInstr, but other
  9852. than that I see no real use for it. On the other hand, George
  9853. Boole thought that Boolean logic was of solely theoretical
  9854. interest, and yet without it there would be no computers. I
  9855. leave it to you to find the earth-shattering possibilities of
  9856. Reverse!
  9857.  
  9858.    Reverse St$
  9859.  
  9860. St$      string to be reversed
  9861. -------
  9862. St$      reversed string
  9863.  
  9864. Name  : ReverseD             (Reverse Double precision array)
  9865. Class : Array management
  9866. Level : Any
  9867.  
  9868. This routine reverses the elements in an array of
  9869. double-precision numbers. This will probably be most useful for
  9870. an array sorted by SortD, in case you want the numbers to go
  9871. from largest to smallest.
  9872.  
  9873. The array is assumed to start at element 1. You may specify the
  9874. last element in the array, allowing you to reverse only part of
  9875. an array if you like.
  9876.  
  9877.    ReverseD Array#(), Elements%
  9878.  
  9879. Array#()    array to be reversed
  9880. Elements%   number of elements in array
  9881. -------
  9882. Array#()    reversed array
  9883.  
  9884. Name  : ReverseI             (Reverse Integer array)
  9885. Class : Array management
  9886. Level : Any
  9887.  
  9888. This routine reverses the elements in an array of integers. This
  9889. will probably be most useful for an array sorted by SortI, or a
  9890. pointer array used in PSortD, PSortI, PSortL, PSortS, or
  9891. PSortSt, in case you want the values to go from largest to
  9892. smallest.
  9893.  
  9894. The array is assumed to start at element 1. You may specify the
  9895. last element in the array, allowing you to reverse only part of
  9896. an array if you like.
  9897.  
  9898.    ReverseI Array%(), Elements%
  9899.  
  9900. Array%()    array to be reversed
  9901. Elements%   number of elements in array
  9902. -------
  9903. Array%()    reversed array
  9904.  
  9905. Name  : ReverseL             (Reverse Long integer array)
  9906. Class : Array management
  9907. Level : Any
  9908.  
  9909. This routine reverses the elements in an array of long integers.
  9910. This will probably be most useful for an array sorted by SortL,
  9911. in case you want the values to go from largest to smallest.
  9912.  
  9913. The array is assumed to start at element 1. You may specify the
  9914. last element in the array, allowing you to reverse only part of
  9915. an array if you like.
  9916.  
  9917.    ReverseL Array&(), Elements%
  9918.  
  9919. Array&()    array to be reversed
  9920. Elements%   number of elements in array
  9921. -------
  9922. Array&()    reversed array
  9923.  
  9924. Name  : ReverseS             (Reverse Single precision array)
  9925. Class : Array management
  9926. Level : Any
  9927.  
  9928. This routine reverses the elements in an array of
  9929. single-precision numbers. This will probably be most useful for
  9930. an array sorted by SortS, in case you want the numbers to go
  9931. from largest to smallest.
  9932.  
  9933. The array is assumed to start at element 1. You may specify the
  9934. last element in the array, allowing you to reverse only part of
  9935. an array if you like.
  9936.  
  9937.    ReverseS Array!(), Elements%
  9938.  
  9939. Array!()    array to be reversed
  9940. Elements%   number of elements in array
  9941. -------
  9942. Array!()    reversed array
  9943.  
  9944. Name  : ReverseSt            (Reverse String array)
  9945. Class : Array management
  9946. Level : Any
  9947.  
  9948. This routine reverses the elements in a string array. This will
  9949. probably be most useful for an array sorted by SortSt, in case
  9950. you want the strings to be in reverse-alphabetical order.
  9951.  
  9952. The array is assumed to start at element 1. You may specify the
  9953. last element in the array, allowing you to reverse only part of
  9954. an array if you like.
  9955.  
  9956.    ReverseSt Array$(), Elements%
  9957.  
  9958. Array$()    array to be reversed
  9959. Elements%   number of elements in array
  9960. -------
  9961. Array$()    reversed array
  9962.  
  9963. Name  : RInstr               (Reverse INSTR)
  9964. Class : String
  9965. Level : Any
  9966.  
  9967. Like INSTR, this routine tells you the position of a substring
  9968. within a string. A "reverse" search is used, however-- whereas
  9969. INSTR tells you the first match, RInstr tells you the last
  9970. match. Similarly, whereas INSTR will tell you that a null search
  9971. string matches the main string at the first position, RInstr
  9972. will match on the last position. Of course, most of the time you
  9973. won't be searching for a null string!
  9974.  
  9975.    RInstr MainSt$, SeekSt$, Posn%
  9976.  
  9977. MainSt$    string to search
  9978. SeekSt$    string for which to search
  9979. -------
  9980. Posn%      position of substring within main string (0 no match)
  9981.  
  9982. Name  : RndI%                (Random Integer)
  9983. Class : Numeric
  9984. Level : Any
  9985.  
  9986. This function provides a shell around the BASIC function, RND.
  9987. It returns a "random" number in a range you specify (e.g., if
  9988. you pass it 10, it will return 0-9).
  9989.  
  9990. See also Rand%, which is entirely independent of RND.
  9991.  
  9992.    Number% = RndI%(Range%)
  9993.  
  9994. Range%      range of desired pseudo-random number
  9995. -------
  9996. Number%     pseudo-random number from 0 to Range% - 1
  9997.  
  9998. Name  : RolSt                (Rotate Left String of bits)
  9999. Class : String
  10000. Level : Any
  10001.  
  10002. This routine rotates the bits in a string left by a desired
  10003. amount. This may be helpful for manupulating strings containing
  10004. bit flags, images, et al.
  10005.  
  10006.    RolSt St$, Count%
  10007.  
  10008. St$       string to rotate left
  10009. Count%    bits by which to rotate
  10010. -------
  10011. St$       rotated string
  10012.  
  10013. Name  : RorSt                (Rotate Right String of bits)
  10014. Class : String
  10015. Level : Any
  10016.  
  10017. This routine rotates the bits in a string right by a desired
  10018. amount. This may be helpful for manupulating strings containing
  10019. bit flags, images, et al.
  10020.  
  10021.    RorSt St$, Count%
  10022.  
  10023. St$       string to rotate right
  10024. Count%    bits by which to rotate
  10025. -------
  10026. St$       rotated string
  10027.  
  10028. Name  : RotateL              (Rotate Left)
  10029. Class : Numeric
  10030. Level : Any
  10031.  
  10032. This routine rotates the bits in an integer left by a desired
  10033. amount.
  10034.  
  10035.    RotateL Value%, Count%
  10036.  
  10037. Value%    number to rotate left
  10038. Count%    bits by which to rotate
  10039. -------
  10040. Value%    rotated number
  10041.  
  10042. Name  : RotateLL             (Rotate Left Long)
  10043. Class : Numeric
  10044. Level : Any
  10045.  
  10046. This routine rotates the bits in a long integer left by a
  10047. desired amount.
  10048.  
  10049.    RotateLL Value&, Count%
  10050.  
  10051. Value&    number to rotate left
  10052. Count%    bits by which to rotate
  10053. -------
  10054. Value&    rotated number
  10055.  
  10056. Name  : RotateR              (Rotate Right)
  10057. Class : Numeric
  10058. Level : Any
  10059.  
  10060. This routine rotates the bits in an integer right by a desired
  10061. amount.
  10062.  
  10063.    RotateR Value%, Count%
  10064.  
  10065. Value%    number to rotate right
  10066. Count%    bits by which to rotate
  10067. -------
  10068. Value%    rotated number
  10069.  
  10070. Name  : RotateRL             (Rotate Right Long)
  10071. Class : Numeric
  10072. Level : Any
  10073.  
  10074. This routine rotates the bits in a long integer right by a
  10075. desired amount.
  10076.  
  10077.    RotateRL Value&, Count%
  10078.  
  10079. Value&    number to rotate right
  10080. Count%    bits by which to rotate
  10081. -------
  10082. Value&    rotated number
  10083.  
  10084. Name  : RRotate              (Right Rotate string)
  10085. Class : String
  10086. Level : Any
  10087.  
  10088. This routine rotates the characters in a string right once. I'll
  10089. admit that I haven't found a use for this myself, but people are
  10090. always coming up with new uses for things... and it complements
  10091. the more useful LRotate routine.
  10092.  
  10093. See also LRotate.
  10094.  
  10095.    RRotate St$
  10096.  
  10097. St$      string to be rotated right once
  10098. -------
  10099. St$      string after being rotated right once
  10100.  
  10101. Name  : RScroll              (Right Scroll)
  10102. Class : Display
  10103. Level : Clone
  10104.  
  10105. This routine scrolls any selected part of the display right. You
  10106. may scroll as many times as you like, or scroll "zero" times to
  10107. totally clear the selected part of the display.
  10108.  
  10109.    RScroll TopRow%, LeftCol%, BottomRow%, RightCol%, Times%
  10110.  
  10111. TopRow%      top row of the area to scroll
  10112. LeftCol%     left column of the area to scroll
  10113. BottomRow%   top row of the area to scroll
  10114. RightCol%    left column of the area to scroll
  10115. Times%       number of times (or rows) to scroll
  10116.  
  10117. Name  : SBFreeHandles%       (SoundBlaster Free Handles)
  10118. Class : SoundBlaster
  10119. Level : BIOS
  10120.  
  10121. This function tells you how many SoundBlaster XMS handles are
  10122. available. In order for any such handles to be available, the
  10123. SBSIM driver must have been configured to use XMS (with the
  10124. SBSIM.CFG file-- see your SoundBlaster manual for details), and
  10125. XMS memory must also be available. XMS requires an AT-class
  10126. computer (80286 or better) with extended memory and an XMS
  10127. driver. XMS drivers are included with current versions of
  10128. MS-DOS, Windows, and memory managers such as QEMM and 386Max.
  10129.  
  10130. Routines in this set include:
  10131.    SBFreeHandles%, SBFreeXMS, SBGetActive, SBGetBuffer,
  10132.    SBGetDrivers, SBGetVer, SBGetVolume, SBInt%, SBInitSrcFile,
  10133.    SBInitSrcXMS, SBIsFree, SBLoadXMS, SBMapMIDI, SBPause,
  10134.    SBPlay, SBResume, SBSetVolume, SBStatus%, SBStop
  10135.  
  10136.    Free% = SBFreeHandles%
  10137.  
  10138. -------
  10139. Free%      number of free SBSIM XMS handles
  10140.  
  10141. Name  : SBFreeXMS            (SoundBlaster Free XMS handle)
  10142. Class : SoundBlaster
  10143. Level : BIOS
  10144.  
  10145. This routine frees an SBSIM XMS handle that you were using. It
  10146. returns the associated XMS memory to the system and releases the
  10147. handle. You should always free a handle when you're done using
  10148. it, as it takes up valuable system resources.
  10149.  
  10150. See PLAYVOC.BAS for an example.
  10151.  
  10152. Routines in this set include:
  10153.    SBFreeHandles%, SBFreeXMS, SBGetActive, SBGetDrivers,
  10154.    SBGetVer, SBGetVolume, SBInt%, SBInitSrcFile, SBInitSrcXMS,
  10155.    SBIsFree, SBLoadXMS, SBMapMIDI, SBPause, SBPlay, SBResume,
  10156.    SBSetVolume, SBStatus%, SBStop
  10157.  
  10158.    SBFreeXMS Handle%
  10159.  
  10160. Handle%     SBSIM XMS handle to release
  10161.  
  10162. Name  : SBGetActive          (SoundBlaster Get Active drivers)
  10163. Class : SoundBlaster
  10164. Level : BIOS
  10165.  
  10166. This routine tells you which SoundBlaster drivers are active.
  10167. Active drivers are those involved in playing something, so this
  10168. routine tells you when a sound is finished. You can terminate a
  10169. sound at any point with SBStop.
  10170.  
  10171. Routines in this set include:
  10172.    SBFreeHandles%, SBFreeXMS, SBGetActive, SBGetDrivers,
  10173.    SBGetVer, SBGetVolume, SBInt%, SBInitSrcFile, SBInitSrcXMS,
  10174.    SBIsFree, SBLoadXMS, SBMapMIDI, SBPause, SBPlay, SBResume,
  10175.    SBSetVolume, SBStatus%, SBStop
  10176.  
  10177. See PLAYVOC.BAS for an example.
  10178.  
  10179.    SBGetActive FM%, DskVoice%, MemVoice%, Auxiliary%, MIDI%
  10180.  
  10181. -------
  10182. FM%         whether FM driver (.CMF) is active (0 no)
  10183. DskVoice%   whether Disk Voice driver (.VOC) is active (0 no)
  10184. MemVoice%   whether Memory Voice driver (.VOC in XMS) is active
  10185. Auxiliary%  whether Auxiliary driver is active (0 no)
  10186. MIDI%       whether MIDI driver (.MID) is active (0 no)
  10187.  
  10188. Name  : SBGetDrivers         (SoundBlaster Get Drivers)
  10189. Class : SoundBlaster
  10190. Level : BIOS
  10191.  
  10192. This routine tells you which SoundBlaster drivers are installed.
  10193.  
  10194. Routines in this set include:
  10195.    SBFreeHandles%, SBFreeXMS, SBGetActive, SBGetDrivers,
  10196.    SBGetVer, SBGetVolume, SBInt%, SBInitSrcFile, SBInitSrcXMS,
  10197.    SBIsFree, SBLoadXMS, SBMapMIDI, SBPause, SBPlay, SBResume,
  10198.    SBSetVolume, SBStatus%, SBStop
  10199.  
  10200.    SBGetDrivers FM%, DskVoice%, MemVoice%, Auxiliary%, MIDI%
  10201.  
  10202. -------
  10203. FM%         whether FM driver (.CMF) is there (0 no)
  10204. DskVoice%   whether Disk Voice driver (.VOC) is there (0 no)
  10205. MemVoice%   whether Memory Voice driver (.VOC in XMS) is there
  10206. Auxiliary%  whether Auxiliary driver is there (0 no)
  10207. MIDI%       whether MIDI driver (.MID) is there (0 no)
  10208.  
  10209. Name  : SBGetVer             (SoundBlaster Get Version)
  10210. Class : SoundBlaster
  10211. Level : BIOS
  10212.  
  10213. This routine returns the version number of the SBSIM driver.
  10214.  
  10215. Routines in this set include:
  10216.    SBFreeHandles%, SBFreeXMS, SBGetActive, SBGetDrivers,
  10217.    SBGetVer, SBGetVolume, SBInt%, SBInitSrcFile, SBInitSrcXMS,
  10218.    SBIsFree, SBLoadXMS, SBMapMIDI, SBPause, SBPlay, SBResume,
  10219.    SBSetVolume, SBStatus%, SBStop
  10220.  
  10221.    SBGetVer MajorV%, MinorV%
  10222.  
  10223. -------
  10224. MajorV%     major version number (e.g., 1 for v1.20)
  10225. MinorV%     minor version number (e.g., 20 for v1.20)
  10226.  
  10227. Name  : SBGetVolume          (SoundBlaster Get Volume level)
  10228. Class : SoundBlaster
  10229. Level : BIOS
  10230.  
  10231. This routine allows you to get the volume level for specified
  10232. SBSIM devices. Stereo volume controls are provided for SBPro and
  10233. SB-16 adapters, which support stereo. For older mono
  10234. SoundBlasters, the "left" speaker is the active one.
  10235.  
  10236. You may select from any of the following SBSIM sound sources:
  10237.  
  10238.  Source   Description
  10239.  ------   ------------
  10240.    0      Master
  10241.    1      Voice
  10242.    2      FM
  10243.    3      CD
  10244.    4      Line in
  10245.    5      Microphone
  10246.    6      PC Speaker
  10247.  
  10248. Routines in this set include:
  10249.    SBFreeHandles%, SBFreeXMS, SBGetActive, SBGetDrivers,
  10250.    SBGetVer, SBGetVolume, SBInt%, SBInitSrcFile, SBInitSrcXMS,
  10251.    SBIsFree, SBLoadXMS, SBMapMIDI, SBPause, SBPlay, SBResume,
  10252.    SBSetVolume, SBStatus%, SBStop
  10253.  
  10254.    SBGetVolume Source%, LeftVol%, RightVol%
  10255.  
  10256. Source%     sound source
  10257. -------
  10258. LeftVol%    left volume (0-255)
  10259. RightVol%   right volume (0-255)
  10260.  
  10261. Name  : SBInitSrcFile        (SoundBlaster Init Source File)
  10262. Class : SoundBlaster
  10263. Level : BIOS
  10264.  
  10265. This routine prepares the SoundBlaster to play from a file. You
  10266. must specify which SBSIM driver to prepare. The driver may be
  10267. any of the following:
  10268.  
  10269.  Driver   File    Description
  10270.  ------   ----    ------------
  10271.    1      .CMF    FM synthesis
  10272.    2      .VOC    Disk voice
  10273.    5      .MID    MIDI
  10274.  
  10275. Don't forget to include the file extension. Also, be aware that
  10276. this routine doesn't start the sound playing-- that is
  10277. accomplished with SBPlay. See also SBLoadXMS, which allows you
  10278. to initialize from XMS memory instead of from a file.
  10279.  
  10280. See PLAYVOC.BAS for an example.
  10281.  
  10282. Routines in this set include:
  10283.    SBFreeHandles%, SBFreeXMS, SBGetActive, SBGetDrivers,
  10284.    SBGetVer, SBGetVolume, SBInt%, SBInitSrcFile, SBInitSrcXMS,
  10285.    SBIsFree, SBLoadXMS, SBMapMIDI, SBPause, SBPlay, SBResume,
  10286.    SBSetVolume, SBStatus%, SBStop
  10287.  
  10288.    SBInitSrcFile DriverNr%, FileName$, ErrCode%
  10289.  
  10290. DriverNr%   SoundBlaster driver to initialize
  10291. FileName$   file to play
  10292. -------
  10293. ErrCode%    error code (0 if initialization succeeded)
  10294.  
  10295. Name  : SBInitSrcXMS         (SoundBlaster Init Source XMS)
  10296. Class : SoundBlaster
  10297. Level : BIOS
  10298.  
  10299. This routine prepares the SoundBlaster to play from XMS. You
  10300. pass it the SBSIM XMS handle which was returned when the sound
  10301. file was loaded into XMS by SBLoadXMS. Note that this routine
  10302. doesn't start the sound playing-- that is accomplished with
  10303. SBPlay.
  10304.  
  10305. When you are done with an XMS handle, remember to free it using
  10306. SBFreeXMS.
  10307.  
  10308. Routines in this set include:
  10309.    SBFreeHandles%, SBFreeXMS, SBGetActive, SBGetDrivers,
  10310.    SBGetVer, SBGetVolume, SBInt%, SBInitSrcFile, SBInitSrcXMS,
  10311.    SBIsFree, SBLoadXMS, SBMapMIDI, SBPause, SBPlay, SBResume,
  10312.    SBSetVolume, SBStatus%, SBStop
  10313.  
  10314.    SBInitSrcXMS Handle%, ErrCode%
  10315.  
  10316. Handle%     SBSIM XMS handle of sound to play
  10317. -------
  10318. ErrCode%    error code (0 if initialization succeeded)
  10319.  
  10320. Name  : SBInt%               (SoundBlaster Interrupt)
  10321. Class : SoundBlaster
  10322. Level : BIOS
  10323.  
  10324. This function returns the software interrupt number used by the
  10325. SBSIM driver. Most people won't ever need to know the actual
  10326. number. However, this also works as an installation check, as
  10327. the function returns 0 if SBSIM is not installed.
  10328.  
  10329. Routines in this set include:
  10330.    SBFreeHandles%, SBFreeXMS, SBGetActive, SBGetDrivers,
  10331.    SBGetVer, SBGetVolume, SBInt%, SBInitSrcFile, SBInitSrcXMS,
  10332.    SBIsFree, SBLoadXMS, SBMapMIDI, SBPause, SBPlay, SBResume,
  10333.    SBSetVolume, SBStatus%, SBStop
  10334.  
  10335.    IntNr% = SBInt%
  10336.  
  10337. -------
  10338. IntNr%      interrupt number used by SBSIM (0 if no SBSIM)
  10339.  
  10340. Name  : SBIsFree%            (SoundBlaster handle Is Free)
  10341. Class : SoundBlaster
  10342. Level : BIOS
  10343.  
  10344. This function tells you whether a specified SBSIM XMS handle is
  10345. free.
  10346.  
  10347. Routines in this set include:
  10348.    SBFreeHandles%, SBFreeXMS, SBGetActive, SBGetDrivers,
  10349.    SBGetVer, SBGetVolume, SBInt%, SBInitSrcFile, SBInitSrcXMS,
  10350.    SBIsFree, SBLoadXMS, SBMapMIDI, SBPause, SBPlay, SBResume,
  10351.    SBSetVolume, SBStatus%, SBStop
  10352.  
  10353.    Free% = SBIsFree%(Handle%)
  10354.  
  10355. Handle%     SBSIM XMS handle to test
  10356. -------
  10357. Free%       whether handle is free (0 no, -1 yes)
  10358.  
  10359. Name  : SBLoadXMS            (SoundBlaster Load XMS)
  10360. Class : SoundBlaster
  10361. Level : BIOS
  10362.  
  10363. This routine is used to load a .VOC file into XMS. If you just
  10364. want to play directly from a file, see SBInitSrcFile instead.
  10365.  
  10366. Unlike SBInitSrcFile, you don't have to specify which SBSIM
  10367. driver to use. SBLoadXMS implicitly uses the Memory Voice
  10368. driver, which handles XMS sound data in .VOC file format.
  10369.  
  10370. You must pass this routine the handle of an SBSIM XMS area.
  10371. Normally, you will want to set the handle to zero, which tells
  10372. the routine to use the first available handle. A non-zero handle
  10373. will be returned for you to use with SBInitSrcXMS.
  10374.  
  10375. Don't forget to include the file extension. Also, be aware that
  10376. this routine doesn't start the sound playing-- that is
  10377. accomplished with SBPlay.
  10378.  
  10379. Routines in this set include:
  10380.    SBFreeHandles%, SBFreeXMS, SBGetActive, SBGetDrivers,
  10381.    SBGetVer, SBGetVolume, SBInt%, SBInitSrcFile, SBInitSrcXMS,
  10382.    SBIsFree, SBLoadXMS, SBMapMIDI, SBPause, SBPlay, SBResume,
  10383.    SBSetVolume, SBStatus%, SBStop
  10384.  
  10385.    SBLoadXMS FileName$, Handle%, ErrCode%
  10386.  
  10387. FileName$   file to play
  10388. Handle%     SBSIM XMS handle to use (set to 0; see above)
  10389. -------
  10390. Handle%     active SBSIM XMS handle
  10391. ErrCode%    error code (0 if initialization succeeded)
  10392.  
  10393. Name  : SBMapMIDI            (SoundBlaster Map MIDI)
  10394. Class : SoundBlaster
  10395. Level : BIOS
  10396.  
  10397. This routine sets the MIDI channel mapper. You may choose from
  10398. the following:
  10399.  
  10400.    0   General mapper
  10401.    1   Basic mapper
  10402.    2   Extended mapper
  10403.  
  10404. Routines in this set include:
  10405.    SBFreeHandles%, SBFreeXMS, SBGetActive, SBGetDrivers,
  10406.    SBGetVer, SBGetVolume, SBInt%, SBInitSrcFile, SBInitSrcXMS,
  10407.    SBIsFree, SBLoadXMS, SBMapMIDI, SBPause, SBPlay, SBResume,
  10408.    SBSetVolume, SBStatus%, SBStop
  10409.  
  10410.    SBMapMIDI MapNr%
  10411.  
  10412. MapNr%      desired MIDI channel mapping
  10413.  
  10414. Name  : SBPause              (SoundBlaster Pause)
  10415. Class : SoundBlaster
  10416. Level : BIOS
  10417.  
  10418. This routine pauses a playing driver. You may select from any of
  10419. the following SBSIM drivers:
  10420.  
  10421.  Driver   File    Description
  10422.  ------   ----    ------------
  10423.    1      .CMF    FM synthesis
  10424.    2      .VOC    Disk voice
  10425.    3      <XMS>   Memory voice
  10426.    5      .MID    MIDI
  10427.  
  10428. Routines in this set include:
  10429.    SBFreeHandles%, SBFreeXMS, SBGetActive, SBGetDrivers,
  10430.    SBGetVer, SBGetVolume, SBInt%, SBInitSrcFile, SBInitSrcXMS,
  10431.    SBIsFree, SBLoadXMS, SBMapMIDI, SBPause, SBPlay, SBResume,
  10432.    SBSetVolume, SBStatus%, SBStop
  10433.  
  10434.    SBPause Driver%
  10435.  
  10436. Driver%     driver to pause
  10437.  
  10438. Name  : SBPlay               (SoundBlaster Play)
  10439. Class : SoundBlaster
  10440. Level : BIOS
  10441.  
  10442. This routine plays a specified driver. The driver must have been
  10443. initialized beforehand by SBInitSrcFile or SBInitSrcXMS. You may
  10444. select from any of the following SBSIM drivers:
  10445.  
  10446.  Driver   File    Description
  10447.  ------   ----    ------------
  10448.    1      .CMF    FM synthesis
  10449.    2      .VOC    Disk voice
  10450.    3      <XMS>   Memory voice
  10451.    5      .MID    MIDI
  10452.  
  10453. Play can be paused with SBPause, resumed with SBResume, and
  10454. stopped with SBStop. You can tell which drivers are currently
  10455. playing with SBGetActive. You can read the status word with
  10456. SBStatus%, though most people won't need it.
  10457.  
  10458. Routines in this set include:
  10459.    SBFreeHandles%, SBFreeXMS, SBGetActive, SBGetDrivers,
  10460.    SBGetVer, SBGetVolume, SBInt%, SBInitSrcFile, SBInitSrcXMS,
  10461.    SBIsFree, SBLoadXMS, SBMapMIDI, SBPause, SBPlay, SBResume,
  10462.    SBSetVolume, SBStatus%, SBStop
  10463.  
  10464. See PLAYVOC.BAS for an example.
  10465.  
  10466.    SBPlay Driver%
  10467.  
  10468. Driver%     driver to play
  10469.  
  10470. Name  : SBResume             (SoundBlaster Resume)
  10471. Class : SoundBlaster
  10472. Level : BIOS
  10473.  
  10474. This routine resumes playing a paused driver. You may select
  10475. from any of the following SBSIM drivers:
  10476.  
  10477.  Driver   File    Description
  10478.  ------   ----    ------------
  10479.    1      .CMF    FM synthesis
  10480.    2      .VOC    Disk voice
  10481.    3      <XMS>   Memory voice
  10482.    5      .MID    MIDI
  10483.  
  10484. Routines in this set include:
  10485.    SBFreeHandles%, SBFreeXMS, SBGetActive, SBGetDrivers,
  10486.    SBGetVer, SBGetVolume, SBInt%, SBInitSrcFile, SBInitSrcXMS,
  10487.    SBIsFree, SBLoadXMS, SBMapMIDI, SBPause, SBPlay, SBResume,
  10488.    SBSetVolume, SBStatus%, SBStop
  10489.  
  10490.    SBResume Driver%
  10491.  
  10492. Driver%     driver to resume
  10493.  
  10494. Name  : SBSetVolume          (SoundBlaster Set Volume level)
  10495. Class : SoundBlaster
  10496. Level : BIOS
  10497.  
  10498. This routine allows you to set the volume level for specified
  10499. SBSIM devices. Stereo volume controls are provided for SBPro and
  10500. SB-16 adapters, which support stereo. For older mono
  10501. SoundBlasters, the "left" speaker is the active one.
  10502.  
  10503. You may select from any of the following SBSIM sound sources:
  10504.  
  10505.  Source   Description
  10506.  ------   ------------
  10507.    0      Master
  10508.    1      Voice
  10509.    2      FM
  10510.    3      CD
  10511.    4      Line in
  10512.    5      Microphone
  10513.    6      PC Speaker
  10514.  
  10515. Routines in this set include:
  10516.    SBFreeHandles%, SBFreeXMS, SBGetActive, SBGetDrivers,
  10517.    SBGetVer, SBGetVolume, SBInt%, SBInitSrcFile, SBInitSrcXMS,
  10518.    SBIsFree, SBLoadXMS, SBMapMIDI, SBPause, SBPlay, SBResume,
  10519.    SBSetVolume, SBStatus%, SBStop
  10520.  
  10521.    SBSetVolume Source%, LeftVol%, RightVol%
  10522.  
  10523. Source%     sound source
  10524. LeftVol%    left volume (0-255)
  10525. RightVol%   right volume (0-255)
  10526.  
  10527. Name  : SBStatus%            (SoundBlaster Status)
  10528. Class : SoundBlaster
  10529. Level : BIOS
  10530.  
  10531. This function returns the status word for a specified SBSIM
  10532. driver. The status generally seems to be -1 while a driver is
  10533. playing something and 0 when it isn't, but different status
  10534. values can be encoded into sound files. This is typically used
  10535. to synchronize video with the sound.
  10536.  
  10537. If you just want to know whether or not a specific driver is
  10538. busy, use SBGetActive instead.
  10539.  
  10540. You may select from any of the following SBSIM drivers:
  10541.  
  10542.  Driver   File    Description
  10543.  ------   ----    ------------
  10544.    1      .CMF    FM synthesis
  10545.    2      .VOC    Disk voice
  10546.    3      <XMS>   Memory voice
  10547.    5      .MID    MIDI
  10548.  
  10549. Routines in this set include:
  10550.    SBFreeHandles%, SBFreeXMS, SBGetActive, SBGetDrivers,
  10551.    SBGetVer, SBGetVolume, SBInt%, SBInitSrcFile, SBInitSrcXMS,
  10552.    SBIsFree, SBLoadXMS, SBMapMIDI, SBPause, SBPlay, SBResume,
  10553.    SBSetVolume, SBStatus%, SBStop
  10554.  
  10555.    Status% = SBStatus%(Driver%)
  10556.  
  10557. Driver%     driver to check
  10558.  
  10559. Name  : SBStop               (SoundBlaster Stop)
  10560. Class : SoundBlaster
  10561. Level : BIOS
  10562.  
  10563. This routine stops playing a paused driver. You may select from
  10564. any of the following SBSIM drivers:
  10565.  
  10566.  Driver   File    Description
  10567.  ------   ----    ------------
  10568.    1      .CMF    FM synthesis
  10569.    2      .VOC    Disk voice
  10570.    3      <XMS>   Memory voice
  10571.    5      .MID    MIDI
  10572.  
  10573. Routines in this set include:
  10574.    SBFreeHandles%, SBFreeXMS, SBGetActive, SBGetDrivers,
  10575.    SBGetVer, SBGetVolume, SBInt%, SBInitSrcFile, SBInitSrcXMS,
  10576.    SBIsFree, SBLoadXMS, SBMapMIDI, SBPause, SBPlay, SBResume,
  10577.    SBSetVolume, SBStatus%, SBStop
  10578.  
  10579. See PLAYVOC.BAS for an example.
  10580.  
  10581.    SBStop Driver%
  10582.  
  10583. Driver%     driver to stop
  10584.  
  10585. Name  : ScanKey              (Scan Keyboard)
  10586. Class : Input
  10587. Level : BIOS
  10588.  
  10589. This one's like INKEY$, but a little bit more subtle. It will
  10590. tell you if there's a key waiting (and if so, what key it is)
  10591. without actually getting the key. The key will remain available
  10592. for later retrieval.
  10593.  
  10594. Among the more common uses for this routine is to handle keys
  10595. like Control-S (pause the display) and Control-C (abort). You
  10596. can see if these keys have been pressed without disturbing
  10597. anything else the user might have typed. DOS uses exactly this
  10598. technique for handling these keys. Since BASIC doesn't go
  10599. through DOS I/O, though, the only way for you to support such
  10600. nice features is to write them into your program with ScanKey.
  10601.  
  10602.    ScanKey CharCode%, CharType%
  10603.  
  10604. -------
  10605. CharType%   key type: 0 none, 1 normal, 2 extended (scan code)
  10606. CharCode%   key ASCII or scan code
  10607.  
  10608. Name  : Scroll               (Scroll)
  10609. Class : Display
  10610. Level : BIOS
  10611.  
  10612. This routine scrolls any selected part of the display up. You
  10613. may scroll as many times as you like, or scroll "zero" times to
  10614. totally clear the selected part of the display.
  10615.  
  10616. Note that BIOS-level scrolling can cause the screen to flicker
  10617. on some CGAs due to a combination of unfortunate design factors.
  10618.  
  10619.    Scroll TopRow%, LeftCol%, BottomRow%, RightCol%, Times%
  10620.  
  10621. TopRow      top row of the area to scroll
  10622. LeftCol%    left column of the area to scroll
  10623. BottomRow   top row of the area to scroll
  10624. RightCol%   left column of the area to scroll
  10625. Times%      number of times (or rows) to scroll
  10626.  
  10627. Name  : ScrRest              (Screen Restore)
  10628. Class : Display
  10629. Level : Clone
  10630.  
  10631. The ScrRest routine restores a display that was saved using
  10632. ScrSave or a similar routine. It only works in text modes, and
  10633. expects an 80x25 screen. See PutScreen or DPutScreen if you need
  10634. to work with other screen sizes.
  10635.  
  10636.    ScrRest Array%(), Page%, Fast%
  10637.  
  10638. Array%()   array holding the display information
  10639. Page%      page on which to restore the display
  10640. Fast%      whether to use fast mode (0 no)
  10641.  
  10642. Name  : ScrSave              (Screen Save)
  10643. Class : Display
  10644. Level : Clone
  10645.  
  10646. The ScrSave routine saves the display to an integer array. Only
  10647. text modes are supported. For an 80x25 display, the array must
  10648. hold 4,000 bytes, so you would use DIM Array%(1 TO 2000).
  10649.  
  10650. ScrSave expects an 80x25 screen. Use GetScreen or DGetScreen if
  10651. you need to work with other screen sizes.
  10652.  
  10653.    ScrSave Array%(), Page%, Fast%
  10654.  
  10655. Page%      display page to get
  10656. Fast%      whether to use fast mode (0 no)
  10657. -------
  10658. Array%()   saved display information
  10659.  
  10660. Name  : SCrunch              (Screen Crunch)
  10661. Class : Display
  10662. Level : Any
  10663.  
  10664. This routine is designed to be used in conjunction with ScrSave
  10665. and the other routines which store an entire 80x25 text screen
  10666. in an array. It performs a "screen crunch", compressing the
  10667. original data into a new array. The average result is about 8x
  10668. smaller than the original screen, resulting in a vast savings in
  10669. memory (4,000 bytes vs 500 or so). The compression algorithm is
  10670. very fast and will not take any noticeable amount of time for
  10671. most purposes.
  10672.  
  10673. Besides saving main memory, this is great for storing screens as
  10674. disk files! The compression will not only make the file(s)
  10675. smaller, but will make disk access faster since there is less
  10676. information to transfer.
  10677.  
  10678. If you need to deal with text screen images of other than 80x25
  10679. in size, try the SCrunchSS routine instead.
  10680.  
  10681.    SCrunch DSeg%, DOfs%, CSeg%, COfs%, Bytes%
  10682.  
  10683. DSeg%     segment of the original screen image
  10684. DOfs%     offset of the original screen image
  10685. CSeg%     segment of array in which to store compressed image
  10686. COfs%     offset of array in which to store compressed image
  10687. -------
  10688. Bytes%    number of bytes in the compressed image
  10689.  
  10690. Name  : SCrunchSS            (Screen Crunch, Sized Screen)
  10691. Class : Display
  10692. Level : Any
  10693.  
  10694. This routine is designed to be used in conjunction with ScrSave
  10695. and the other routines which store a text screen in an array. It
  10696. performs a "screen crunch", compressing the original data into a
  10697. new array. The average result is about 8x smaller than the
  10698. original screen, resulting in a vast savings in memory. The
  10699. compression algorithm is very fast and will not take any
  10700. noticeable amount of time for most purposes.
  10701.  
  10702. Besides saving main memory, this is great for storing screens as
  10703. disk files! The compression will not only make the file(s)
  10704. smaller, but will make disk access faster since there is less
  10705. information to transfer.
  10706.  
  10707. If you only work with 80x25 text screen images, you may find it
  10708. more convenient to use the SCrunch routine instead.
  10709.  
  10710.    SCrunchSS DSeg%, DOfs%, Rows%, Cols%, CSeg%, COfs%, Bytes%
  10711.  
  10712. DSeg%     segment of the original screen image
  10713. DOfs%     offset of the original screen image
  10714. Rows%     rows in original screen image
  10715. Cols%     columns in original screen image
  10716. CSeg%     segment of array in which to store compressed image
  10717. COfs%     offset of array in which to store compressed image
  10718. -------
  10719. Bytes%    number of bytes in the compressed image
  10720.  
  10721. Name  : SDFlush              (SmartDrive Flush)
  10722. Class : Disk
  10723. Level : BIOS
  10724.  
  10725. This routine flushes SmartDrive disk caches, forcing it to write
  10726. any data in memory to the appropriate disk(s).
  10727.  
  10728. This routine requires SmartDrive 4.0 or later.
  10729.  
  10730. Routines in this set include:
  10731.    SDFlush, SDRCached%, SDReset, SDStats, SDVersion, SDWCached%
  10732.  
  10733.    SDFlush
  10734.  
  10735. Name  : SDVersion           (SmartDrive Version)
  10736. Class : Disk Equipment
  10737. Level : BIOS
  10738.  
  10739. This routine returns the SmartDrive version. It is known to work
  10740. with SmartDrive 4.0 and later. It should work with 3.x versions,
  10741. but I haven't been able to test it-- if you are using a version
  10742. of SmartDrive before 4.0, please let me know which version and
  10743. what results you get.
  10744.  
  10745. The other PBClone routines which access SmartDrive require
  10746. SmartDrive 4.0 or later to function. This is due to a radical
  10747. alteration of the SmartDrive interface as of v4.0, making it
  10748. incompatible with earlier versions-- more Microsoft craziness.
  10749.  
  10750. Routines in this set include:
  10751.    SDFlush, SDRCached%, SDReset, SDStats, SDVersion, SDWCached%
  10752.  
  10753.    SDVersion MajorV%, MinorV%
  10754.  
  10755. -------
  10756. MajorV%    major part of version number (e.g., 4 in v4.10)
  10757. MinorV%    minor part of version number (e.g., 10 in v4.10)
  10758.  
  10759. Name  : SDRCached%           (SmartDrive Read Cached)
  10760. Class : Disk
  10761. Level : BIOS
  10762.  
  10763. This function tells you whether a specified drive is being
  10764. read-cached by SmartDrive.
  10765.  
  10766. Note that, in the case of a doubled drive (DoubleSpace, Stacker,
  10767. etc), the virtual drive letter is not the one cached-- for
  10768. instance, my physical hard drive is mapped to H: by DoubleSpace,
  10769. leaving C: as a virtual drive. The virtual drive is not cached
  10770. as such, but the physical drive is-- for example, on my system,
  10771. C: is not cached, but H: is. So, be careful about what
  10772. conclusions you draw about the setup based on this routine. It
  10773. is useful for information and for helping safeguard against
  10774. problems if your program must run without cacheing, but it isn't
  10775. a panacea.
  10776.  
  10777. This routine requires SmartDrive 4.0 or later.
  10778.  
  10779. Routines in this set include:
  10780.    SDFlush, SDRCached%, SDReset, SDStats, SDVersion, SDWCached%
  10781.  
  10782.    Cached% = SDRCached% (Drive$)
  10783.  
  10784. Drive$     drive letter to examine ("" for default drive)
  10785. -------
  10786. Cached%    whether drive is read cached (0 no, -1 yes)
  10787.  
  10788. Name  : SDReset              (SmartDrive Reset)
  10789. Class : Disk
  10790. Level : BIOS
  10791.  
  10792. This routine resets SmartDrive disk caches, clearing them and
  10793. starting caching from a blank slate.
  10794.  
  10795. This routine requires SmartDrive 4.0 or later.
  10796.  
  10797. Routines in this set include:
  10798.    SDFlush, SDRCached%, SDReset, SDStats, SDVersion, SDWCached%
  10799.  
  10800.    SDReset
  10801.  
  10802. Name  : SDStats              (SmartDrive Statistics)
  10803. Class : Disk
  10804. Level : BIOS
  10805.  
  10806. This routine returns the hit/miss statistics for SmartDrive
  10807. cacheing. Hits are the number of times a disk request is
  10808. satisfied by the cache. Misses are the number of times a disk
  10809. request must be read from the disk itself.
  10810.  
  10811. This routine requires SmartDrive 4.0 or later.
  10812.  
  10813. Routines in this set include:
  10814.    SDFlush, SDRCached%, SDReset, SDStats, SDVersion, SDWCached%
  10815.  
  10816.    SDStats Hits&, Misses&
  10817.  
  10818. -------
  10819. Hits&      number of cache hits
  10820. Misses&    number of cache misses
  10821.  
  10822. Name  : SDWCached%           (SmartDrive Write Cached)
  10823. Class : Disk
  10824. Level : BIOS
  10825.  
  10826. This function tells you whether a specified drive is being
  10827. write-cached by SmartDrive.
  10828.  
  10829. Note that, in the case of a doubled drive (DoubleSpace, Stacker,
  10830. etc), the virtual drive letter is not the one cached-- for
  10831. instance, my physical hard drive is mapped to H: by DoubleSpace,
  10832. leaving C: as a virtual drive. The virtual drive is not cached
  10833. as such, but the physical drive is-- for example, on my system,
  10834. C: is not cached, but H: is. So, be careful about what
  10835. conclusions you draw about the setup based on this routine. It
  10836. is useful for information and for helping safeguard against
  10837. problems if your program must run without cacheing, but it isn't
  10838. a panacea.
  10839.  
  10840. This routine requires SmartDrive 4.0 or later.
  10841.  
  10842. Routines in this set include:
  10843.    SDFlush, SDRCached%, SDReset, SDStats, SDVersion, SDWCached%
  10844.  
  10845.    Cached% = SDWCached% (Drive$)
  10846.  
  10847. Drive$     drive letter to examine ("" for default drive)
  10848. -------
  10849. Cached%    whether drive is write cached (0 no, -1 yes)
  10850.  
  10851. Name  : Sec2Time$            (Seconds to Time)
  10852. Class : Time
  10853. Level : Any
  10854.  
  10855. This routine converts the number of seconds past midnight into a
  10856. time string.
  10857.  
  10858.    TimeSt$ = Sec2Time$(Seconds&)
  10859.  
  10860. Seconds&   number of seconds past midnight
  10861. -------
  10862. TimeSt$    time string (TIME$ format)
  10863.  
  10864. Name  : SetBit               (Set Bit)
  10865. Class : Numeric
  10866. Level : Any
  10867.  
  10868. This routine sets a single bit "on" in an integer. Bits are
  10869. numbered 0-15, with 0 being the least significant bit.
  10870.  
  10871.    SetBit Number%, BitNr%
  10872.  
  10873. Number%    number for which to set bit
  10874. BitNr%     bit number (0-15) to set
  10875. -------
  10876. Number%    number with the specified bit set
  10877.  
  10878. Name  : SetCGAColor          (Set CGA Color)
  10879. Class : Display
  10880. Level : Clone
  10881.  
  10882. This routine allows you to set certain aspects of CGA colors
  10883. which aren't available otherwise. It is very CGA-specific,
  10884. however, and may not work on EGA or VGA systems.
  10885.  
  10886. The color specified has different meanings in different CGA
  10887. modes. In the SCREEN 1 graphics mode, it changes the background
  10888. and border color. In SCREEN 2, however, it allows you to change
  10889. the foreground color. While you are still stuck with a single
  10890. foreground color, you can choose what that color will be.
  10891.  
  10892.    SetCGAColor Colour%
  10893.  
  10894. Colour%    color to set (see above)
  10895.  
  10896. Name  : SetComm              (Set Comm port)
  10897. Class : Serial
  10898. Level : DOS
  10899.  
  10900. Although QuickBASIC has a fair range of communications support,
  10901. it doesn't do the capabilities of the PC full justice. It's also
  10902. impossible to change the serial parameters "on the fly" without
  10903. risking disconnection, if BASIC alone is used. SetComm gets
  10904. around those limitations. It should be used -after- the
  10905. appropriate comm port is OPENed by BASIC.
  10906.  
  10907. Note that the true upper limits of the comm speed are determined
  10908. by your program and by the hardware being used. Some PC/XTs may
  10909. have trouble with 9,600 bps, for instance. The ability to set
  10910. the serial port to a high speed doesn't guarantee that the
  10911. hardware can handle it!
  10912.  
  10913.    SetComm CommPort%, Bps%, Parity%, WordLength%, StopBits%
  10914.  
  10915. CommPort%    serial port (1-4, though BASIC only uses 1-2)
  10916. Bps%         bits per second ("baud rate"):
  10917.                 0 for   300       5 for   9,600
  10918.                 1 for   600       6 for  19,200
  10919.                 2 for 1,200       7 for  38,400
  10920.                 3 for 2,400       8 for  57,600
  10921.                 4 for 4,800       9 for 115,200
  10922. Parity%      parity:
  10923.                 0  none
  10924.                 1  odd            3  mark  (always on)
  10925.                 2  even           4  space (always off)
  10926. WordLength%  word length (5-8)
  10927. StopBits%    stop bits (1-2; if WordLength=5, "2" means 1 1/2)
  10928.  
  10929. Name  : SetCommAddr          (Set Comm Address)
  10930. Class : Serial
  10931. Level : Clone
  10932.  
  10933. This routine allows you to set the base port address of a serial
  10934. port.
  10935.  
  10936. One use for SetCommAddr is to give QuickBASIC access to the comm
  10937. port on those unusual machines which have a COM2 but no COM1.
  10938. Use GetCommAddr to get the address of COM2, set the COM1 address
  10939. accordingly, and tell QuickBASIC to use COM1.
  10940.  
  10941. BASIC will normally handle COM1 and COM2, but not COM3 or COM4.
  10942. Although there is no way to use more two ports at once, you can
  10943. fool BASIC into using COM3 by swapping it with COM1, or COM4 by
  10944. swapping it with COM2.
  10945.  
  10946. Don't forget to set the ports back to their original values
  10947. before your program ends!
  10948.  
  10949.    SetCommAddr PortNr%, PortAddr%
  10950.  
  10951. PortNr%     COM port number (1-4)
  10952. PortAddr%   port address
  10953.  
  10954. Name  : SetDateAT            (Set Date of AT clock)
  10955. Class : Time
  10956. Level : BIOS (AT)
  10957.  
  10958. This routine sets the date of the hardware real-time clock in
  10959. AT-class computers. Depending on the DOS version, this date may
  10960. be partially or completely independent of the date kept by DOS
  10961. in software. DOS always reads the date from the hardware clock
  10962. when it starts up. However, use of the DATE command in DOS (and
  10963. the DATE$ function in QuickBASIC) may relate only to the
  10964. software copy of the date, which is not always guaranteed to be
  10965. the same as the date in the hardware clock due to certain
  10966. discrepancies in DOS.
  10967.  
  10968. You may express the year as either a two-digit or four-digit
  10969. number.
  10970.  
  10971. The ProBas and PBClone versions of this routine do not work the
  10972. same way in regards to the year. ProBas assumed that any
  10973. two-digit year was in the 1900s. In contrast, PBClone assumes
  10974. that years 80-99 should be converted to 1980-1999 and that 0-79
  10975. should be converted to 2000-2079. I consider the PBClone method
  10976. more appropriate, with the turn of the century moving closer.
  10977. The date format used does not allow dates before 1980 anyway, so
  10978. nothing is being lost by this change.
  10979.  
  10980.    SetDateAT MonthNr%, DayNr%, YearNr%
  10981.  
  10982. MonthNr%    month number (1-12)
  10983. DayNr%      day (1-31)
  10984. YearNr%     year (1980-2079; see above for two-digit years)
  10985.  
  10986. Name  : SetDrv               (Set default Drive)
  10987. Class : Disk
  10988. Level : DOS
  10989.  
  10990. This routine sets the default disk drive.
  10991.  
  10992. If the specified drive does not exist, the current default drive
  10993. will remain the default.
  10994.  
  10995.    SetDrv Drive$
  10996.  
  10997. Drive$    drive letter
  10998.  
  10999. Name  : SetError             (Set Error code)
  11000. Class : Miscellaneous
  11001. Level : DOS
  11002.  
  11003. The SetError routine allows you to set the "error level" to be
  11004. returned by DOS when your program ends. This is particularly
  11005. handy for returning information to batch files.
  11006.  
  11007. Note that SetError is best used just before your program ENDs,
  11008. to avoid complications.
  11009.  
  11010.    SetError ErrorLevel%
  11011.  
  11012. ErrorLevel%   exit code to be returned by your program
  11013.  
  11014. Name  : SetFAttr             (Set File Attribute)
  11015. Class : Disk
  11016. Level : DOS
  11017.  
  11018. This routine allows you to set the attribute of a file or
  11019. subdirectory. Any combination of the following may be set:
  11020.  
  11021.    Normal          0      (nothing special)
  11022.    Read Only       1      file can be read, but not written to
  11023.    Hidden          2      file will be "invisible"
  11024.    System          4      (for special DOS files-- leave alone)
  11025.    Archive        32      (used by some backup utils- leave be)
  11026.  
  11027. To set more than one attribute, just add the numbers for the
  11028. desired attributes together. The attributes marked "leave alone"
  11029. shouldn't be used casually, but if you're sure you know what
  11030. you're doing...
  11031.  
  11032.    SetFAttr FileName$, FAttr%
  11033.  
  11034. FileName$   name of the file (or subdirectory) to manipulate
  11035. FAttr%      attribute(s) to set
  11036.  
  11037. Name  : SetFTD               (Set File Time and Date)
  11038. Class : Disk
  11039. Level : DOS
  11040.  
  11041. This routine lets you set the time and date of a specified file.
  11042. You may give the year either as two digits or four digits.
  11043.  
  11044. The ProBas and PBClone versions of this routine do not work the
  11045. same way in regards to the year. ProBas assumed that any
  11046. two-digit year was in the 1900s. In contrast, PBClone assumes
  11047. that years 80-99 should be converted to 1980-1999 and that 0-79
  11048. should be converted to 2000-2079. I consider the PBClone method
  11049. more appropriate, with the turn of the century moving closer.
  11050. The DOS date format does not allow dates before 1980 anyway, so
  11051. nothing is being lost by this change.
  11052.  
  11053. Note that the Second% value, if odd, will be rounded down to an
  11054. even number. This is due to the way DOS compresses the time
  11055. format, rather than any limitation in this routine.
  11056.  
  11057.    SetFTD File$, MonthNr%, DayNr%, YearNr%, HourNr%, _
  11058.      MinuteNr%, SecondNr%
  11059.  
  11060. File$        name of file for which to set the time and date
  11061. MonthNr%     month number (1-12)
  11062. DayNr%       day (1-31)
  11063. YearNr%      year (1980-2079; see above for two-digit years)
  11064. HourNr%      hour (0-23)
  11065. MinuteNr%    minute (0-59)
  11066. SecondNr%    second (0-59; if odd, rounded down to even number)
  11067. -------
  11068. MonthNr%     -1 if there was an error, else unchanged
  11069.  
  11070. Name  : SetKbd               (Set Keyboard toggles)
  11071. Class : Input
  11072. Level : Clone
  11073.  
  11074. The SetKbd routine allows you to set the state of any of the
  11075. four keyboard toggles: Insert, Caps lock, Num lock, and Scroll
  11076. Lock. You can give your input routines a professional touch by
  11077. setting this toggles instead of making the user remember to do
  11078. so.
  11079.  
  11080. It's considered proper to restore the original keyboard toggles
  11081. before your program exits, unless of course the purpose of the
  11082. program is to leave the toggles in a particular state! The
  11083. GetKbd routine can be used in conjunction with SetKbd to do
  11084. this.
  11085.  
  11086.    SetKbd Insert%, Caps%, Num%, Scrl%
  11087.  
  11088. Insert%    whether to turn on "insert" mode (0 if no)
  11089. Caps%      whether to turn on "caps lock" (0 if no)
  11090. Num%       whether to put the keypad into numeric mode (0 no)
  11091. Scrl%      whether to turn on "scroll lock" (0 if no)
  11092.  
  11093. Name  : SetLabel             (Set disk volume Label)
  11094. Class : Disk
  11095. Level : DOS
  11096.  
  11097. This routine creates, renames or deletes a disk volume label.
  11098.  
  11099. Note that a disk volume label is essentially a file name without
  11100. an extension. It can contain any character that can normally be
  11101. in a file name, plus spaces and periods.
  11102.  
  11103.    SetLabel Drive$, Label$, ErrCode%
  11104.  
  11105. Drive$     drive to set label on (use "" for current drive)
  11106. Label$     label to install (use "" to delete current label)
  11107. -------
  11108. ErrCode%   whether there was an error (0 no)
  11109.  
  11110. Name  : SetLogiDrive         (Set Logical Drive)
  11111. Class : Disk
  11112. Level : DOS 3.2+
  11113.  
  11114. This routine is useful for systems which only have a single
  11115. floppy drive. In such cases, DOS connects both drive letters A:
  11116. and B: to the same drive. However, only one drive letter is
  11117. active, and when you try to access the "other" drive, DOS
  11118. displays the message:
  11119.  
  11120.   "Insert diskette for drive x: and press any key when ready."
  11121.  
  11122. By setting the active drive yourself, you can bypass this
  11123. message, and your program will look much more professional. See
  11124. also GetLogiDrive$, which allows you to determine which drive
  11125. letter is active for a given drive.
  11126.  
  11127.    SetLogiDrive Drive$, ErrCode%
  11128.  
  11129. Drive$     drive letter to select (use "" for current drive)
  11130. -------
  11131. ErrCode%   whether there was an error (0 no)
  11132.  
  11133. Name  : SetMatD              (Set Matrix to Double)
  11134. Class : Array
  11135. Level : Any
  11136.  
  11137. This routine sets as many elements of a double-precision array
  11138. as you like, starting at a specified place in the array. A good
  11139. use for it is to initialize an array (or a portion of it) to a
  11140. given value.
  11141.  
  11142.    SetMatD DSeg%, DOfs%, Elements%, Value#
  11143.  
  11144. DSeg%      segment of the first array element to add
  11145. DOfs%      offset of the first array element to add
  11146. Elements%  number of array elements to which to add
  11147. Value#     value to which to set each array element
  11148.  
  11149. Name  : SetMatI              (Set Matrix to Integer)
  11150. Class : Array
  11151. Level : Any
  11152.  
  11153. This routine sets as many elements of an integer array as you
  11154. like, starting at a specified place in the array. A good use for
  11155. it is to initialize an array (or a portion of it) to a given
  11156. value.
  11157.  
  11158.    SetMatI DSeg%, DOfs%, Elements%, Value%
  11159.  
  11160. DSeg%      segment of the first array element to add
  11161. DOfs%      offset of the first array element to add
  11162. Elements%  number of array elements to which to add
  11163. Value%     value to which to set each array element
  11164.  
  11165. Name  : SetMatL              (Set Matrix to Long)
  11166. Class : Array
  11167. Level : Any
  11168.  
  11169. This routine sets as many elements of an long integer array as
  11170. you like, starting at a specified place in the array. A good use
  11171. for it is to initialize an array (or a portion of it) to a given
  11172. value.
  11173.  
  11174.    SetMatL DSeg%, DOfs%, Elements%, Value&
  11175.  
  11176. DSeg%      segment of the first array element to add
  11177. DOfs%      offset of the first array element to add
  11178. Elements%  number of array elements to which to add
  11179. Value&     value to which to set each array element
  11180.  
  11181. Name  : SetMatS              (Set Matrix to Single)
  11182. Class : Array
  11183. Level : Any
  11184.  
  11185. This routine sets as many elements of a single-precision array
  11186. as you like, starting at a specified place in the array. A good
  11187. use for it is to initialize an array (or a portion of it) to a
  11188. given value.
  11189.  
  11190.    SetMatS DSeg%, DOfs%, Elements%, Value!
  11191.  
  11192. DSeg%      segment of the first array element to add
  11193. DOfs%      offset of the first array element to add
  11194. Elements%  number of array elements to which to add
  11195. Value!     value to which to set each array element
  11196.  
  11197. Name  : SetMouseLoc          (Set Mouse Location)
  11198. Class : Mouse
  11199. Level : BIOS
  11200.  
  11201. This routine allows you to set the current location of the mouse
  11202. cursor. It doesn't matter if the cursor is visible or invisible.
  11203. SetMouseLoc is only for use in text mode.
  11204.  
  11205. This routine will not work properly if there is no mouse
  11206. available. Use the MMCheck routine if you are not sure.
  11207.  
  11208. See also MMSetLoc, which is for use in graphics modes.
  11209.  
  11210.    SetMouseLoc Row%, Column%
  11211.  
  11212. Row%       mouse cursor row
  11213. Column%    mouse cursor column
  11214.  
  11215. Name  : SetPatch             (Set Patch information)
  11216. Class : Disk
  11217. Level : DOS
  11218.  
  11219. This routine is used after FindPatch. The FindPatch routine
  11220. finds the first DATA statement to be patched. SetPatch places
  11221. new information in that DATA statement and moves the file
  11222. pointer to the position of the next DATA statement. Note that
  11223. there must be only one item per DATA statement; this item must
  11224. be a quoted string. The string in the DATA statement and the
  11225. patch string must be the same length.
  11226.  
  11227. If you need this routine to be able to handle variable-length
  11228. strings, don't fret! Make the DATA string one character longer
  11229. than the maximum you need, and use the extra character to
  11230. indicate the actual string length:
  11231.  
  11232.    SetPatch CHR$(LEN(St$)) + St$
  11233.  
  11234. Then when you READ St$, decode it like so:
  11235.  
  11236.    St$ = MID$(St$, 2, ASC(St$))
  11237.  
  11238. Routines in this set include FindPatch, SetPatch, PatchDone.
  11239.  
  11240.    SetPatch St$
  11241.  
  11242. St$       string to patch into the current DATA statement
  11243.  
  11244. Name  : SetPath              (Set default Path)
  11245. Class : Disk
  11246. Level : DOS
  11247.  
  11248. This routine allows you to set the default path. You may specify
  11249. a drive and/or subdirectory:
  11250.  
  11251.    Path$ = "E:"           ' switch to drive E:
  11252.    Path$ = "\DOC\TECH"    ' switch to subdir \DOC\TECH
  11253.    Path$ = "C:\GAME"      ' switch to drive C:, subdir \GAME
  11254.  
  11255. The "." and ".." directories are not recognized. However, you
  11256. may specify either an absolute or relative path, as usual, and
  11257. can also use either slashes or backslashes as delimiters.
  11258.  
  11259. See also SetDrv, SetSub
  11260.  
  11261.    SetPath Path$, ErrCode%
  11262.  
  11263. Path$      path specification
  11264. -------
  11265. ErrCode%   error code: 0 if no error, else a DOS Error number
  11266.  
  11267. Name  : SetPrtAddr           (Set Printer Address)
  11268. Class : Printer
  11269. Level : Clone
  11270.  
  11271. This routine allows you to set the base port address of a
  11272. parallel port.
  11273.  
  11274. One use for this routine is to fool BASIC into using a different
  11275. port than LPT1 for LPRINT. See also PRTSWAP.
  11276.  
  11277. Note that PS/2 systems only have ports 1-3 available. They use
  11278. the fourth port data area for holding other information. It may
  11279. be a good idea to restrict yourself to ports 1-3 for
  11280. compatibility purposes, although other computers allow ports
  11281. 1-4.
  11282.  
  11283. Don't forget to set the ports back to their original values
  11284. before your program ends!
  11285.  
  11286.    SetPrtAddr PortNr%, PortAddr%
  11287.  
  11288. PortNr%     LPT port number (1-4 or 1-3 [see above])
  11289. PortAddr%   port address
  11290.  
  11291. Name  : SetSub               (Set default Subdirectory)
  11292. Class : Disk
  11293. Level : DOS
  11294.  
  11295. Just like the DOS CD (or CHDIR) command, this routine allows you
  11296. to change the current subdirectory. Unlike the corresponding DOS
  11297. command, you may not use a period or double period as shorthand
  11298. for a directory. However, you may specify either an absolute or
  11299. relative path, as usual, and can also use either slashes or
  11300. backslashes as delimiters.
  11301.  
  11302. You may specify a drive as part of the directory specification,
  11303. in which case the default directory on the specified drive will
  11304. be set (but the current default drive will not change).
  11305.  
  11306. See also SetPath.
  11307.  
  11308.    SetSub SubDir$, ErrCode%
  11309.  
  11310. SubDir$    subdirectory name
  11311. -------
  11312. ErrCode%   error code: 0 if no error, else a DOS Error number
  11313.  
  11314. Name  : SetTimeAT            (Set Time of AT clock)
  11315. Class : Time
  11316. Level : BIOS (AT)
  11317.  
  11318. This routine sets the time to the hardware real-time clock in
  11319. AT-class computers. Depending on the DOS version, this time may
  11320. be partially or completely independent of the time kept by DOS
  11321. in software. DOS always reads the time from the hardware clock
  11322. when it starts up. However, use of the TIME command in DOS (and
  11323. the TIME$ function in QuickBASIC) may relate only to the
  11324. software copy of the time, which is not always guaranteed to be
  11325. the same as the time in the hardware clock due to certain
  11326. discrepancies in DOS.
  11327.  
  11328.    SetTimeAT HourNr%, MinuteNr%, SecondNr%
  11329.  
  11330. HourNr%      hour (0-23)
  11331. MinuteNr%    minute
  11332. SecondNr%    second
  11333.  
  11334. Name  : SetVerify            (Set Verify state)
  11335. Class : Disk
  11336. Level : DOS
  11337.  
  11338. The SetVerify routine allows you to set the state of the DOS
  11339. VERIFY flag. When VERIFY is on, some checking is done to make
  11340. sure that writing to the disk works as requested. The checks are
  11341. not very good, however, and VERIFY slows down disk handling, so
  11342. it is usually better to have VERIFY off.
  11343.  
  11344.    SetVerify VerifyOn%
  11345.  
  11346. VerifyOn%   whether to turn VERIFY on (0 if no)
  11347.  
  11348. Name  : SetVGAColor          (Set VGA Color)
  11349. Class : Display
  11350. Level : BIOS
  11351.  
  11352. This routine sets the color associated with a given color
  11353. number. The color is specified as a combination of red, green,
  11354. and blue intensities. Each intensity may range from off (0) to
  11355. very bright (63).
  11356.  
  11357. If you are dealing with more than one color at a time, you may
  11358. find SetVGAPalette more appropriate.
  11359.  
  11360.    SetVGAColor ColorNr%, Red%, Green%, Blue%
  11361.  
  11362. ColorNr%   color number (1-16 or 1-255, depending on VGA mode)
  11363. Red%       red intensity (0-63)
  11364. Green%     green intensity (0-63)
  11365. Blue%      blue intensity (0-63)
  11366.  
  11367. Name  : SetVGAPalette        (Set VGA Palette)
  11368. Class : Display
  11369. Level : BIOS
  11370.  
  11371. This routine allows you to set any number of the VGA palette
  11372. values from a TYPEd array. The TYPE for the array should be
  11373. defined like this:
  11374.  
  11375.    TYPE Palet
  11376.       IRed AS STRING * 1
  11377.       IBlue AS STRING * 1
  11378.       IGreen AS STRING * 1
  11379.    END TYPE
  11380.  
  11381. This type holds a CHR$-encoded representation of the intensity
  11382. of each component of the color. The values range from 0-63.
  11383.  
  11384. You can change many palette settings at a time, very quickly,
  11385. with this routine. This routine is sufficiently faster than the
  11386. BASIC PALETTE statement as to make palette animation (and some
  11387. stupendous special effects) possible. It may cause flickering on
  11388. displays with less well-designed video BIOS chips, however.
  11389.  
  11390. If you only need to set a few colors, you may find SetVGAColor
  11391. more convenient.
  11392.  
  11393.    SetVGAPalette DSeg%, DOfs%, Start%, Colors%
  11394.  
  11395. DSeg%      segment of the palette array
  11396. DOfs%      offset of the palette array
  11397. Start%     color number to start with
  11398. Colors%    number of colors to set
  11399.  
  11400. Name  : SFRead               (String File Read)
  11401. Class : Disk / String
  11402. Level : DOS
  11403.  
  11404. This routine reads a string from a file that was opened by
  11405. FOpen1 or FCreate. The length of the string you provide
  11406. determines how many characters should be read. If it wasn't
  11407. possible to read all the characters desired, an error code will
  11408. be returned and the BytesRead% value will tell you how many
  11409. characters were actually retrieved.
  11410.  
  11411.    St$ = SPACE$(BytesToRead%)
  11412.    SFRead Handle%, St$, BytesRead%, ErrCode%
  11413.  
  11414. Handle%     handle of the file from which to read
  11415. -------
  11416. St$         data read from the file.  Init to # of chars wanted
  11417. BytesRead%  number of bytes read from the file (if error)
  11418. ErrCode%    error code: 0 if no error, else DOS Error
  11419.  
  11420. Name  : SFWrite              (String File Write)
  11421. Class : Disk / String
  11422. Level : DOS
  11423.  
  11424. This routine writes a string to a file that was opened by FOpen1
  11425. or FCreate. The length of the string you provide determines how
  11426. many characters will be written. If it wasn't possible to write
  11427. the entire string to the file, an error code will be returned
  11428. and the BytesWrit% value will tell you how many characters were
  11429. actually written.
  11430.  
  11431.    SFWrite Handle%, St$, BytesWrit%, ErrCode%
  11432.  
  11433. Handle%     handle of the file to which to write
  11434. St$         data to write to the file.
  11435. -------
  11436. BytesWrit%  number of bytes written to the file (if error)
  11437. ErrCode%    error code: 0 if no error, else DOS Error
  11438.  
  11439. Name  : ShiftL               (Shift Left)
  11440. Class : Numeric
  11441. Level : Any
  11442.  
  11443. This routine shifts the bits in an integer left by a desired
  11444. amount. The effect of this is similar to multiplying the number
  11445. by a power of two, if the number is positive, but is much
  11446. faster.
  11447.  
  11448.    ShiftL Value%, Count%
  11449.  
  11450. Value%    number to shift left
  11451. Count%    bits by which to shift
  11452. -------
  11453. Value%    shifted number
  11454.  
  11455. Name  : ShiftLL              (Shift Left Long)
  11456. Class : Numeric
  11457. Level : Any
  11458.  
  11459. This routine shifts the bits in a long integer left by a desired
  11460. amount. The effect of this is similar to multiplying the number
  11461. by a power of two, if the number is positive, but is much
  11462. faster.
  11463.  
  11464.    ShiftLL Value&, Count%
  11465.  
  11466. Value&    number to shift left
  11467. Count%    bits by which to shift
  11468. -------
  11469. Value&    shifted number
  11470.  
  11471. Name  : ShiftR               (Shift Right)
  11472. Class : Numeric
  11473. Level : Any
  11474.  
  11475. This routine shifts the bits in an integer right by a desired
  11476. amount. The effect of this is similar to dividing the number by
  11477. a power of two, if the number is positive, but is much faster.
  11478.  
  11479.    ShiftR Value%, Count%
  11480.  
  11481. Value%    number to shift right
  11482. Count%    bits by which to shift
  11483. -------
  11484. Value%    shifted number
  11485.  
  11486. Name  : ShiftRL              (Shift Right Long)
  11487. Class : Numeric
  11488. Level : Any
  11489.  
  11490. This routine shifts the bits in a long integer right by a
  11491. desired amount. The effect of this is similar to dividing the
  11492. number by a power of two, if the number is positive, but is much
  11493. faster.
  11494.  
  11495.    ShiftRL Value&, Count%
  11496.  
  11497. Value&    number to shift right
  11498. Count%    bits by which to shift
  11499. -------
  11500. Value&    shifted number
  11501.  
  11502. Name  : ShlSt                (Shift Left String of bits)
  11503. Class : String
  11504. Level : Any
  11505.  
  11506. This routine shifts the bits in a string left by a desired
  11507. amount. This may be helpful for manupulating strings containing
  11508. bit flags, images, et al.
  11509.  
  11510.    ShlSt St$, Count%
  11511.  
  11512. St$       string to shift left
  11513. Count%    bits by which to shift
  11514. -------
  11515. St$       shifted string
  11516.  
  11517. Name  : ShowBMP              (Show Bitmap)
  11518. Class : Display File
  11519. Level : BIOS
  11520.  
  11521. This routine displays a bitmap file (MS Windows .BMP format) on
  11522. the screen. The display must be in SCREEN 13 mode (MCGA or VGA,
  11523. 320x200, 256 colors). You can specify a starting X,Y coordinate,
  11524. or use -1,-1 to scale the image to the screen. Scaling allows
  11525. you to display images larger than 320x200.
  11526.  
  11527. Only 256-color bitmaps are supported. The palette will be
  11528. changed according to the directions in the bitmap file. If
  11529. scaling is chosen and the image is larger than 320x200, the
  11530. screen coordinates will be altered with WINDOW SCREEN to let the
  11531. image fit. Proportional scaling is used to avoid having a
  11532. flattened or stretched image.
  11533.  
  11534.    ShowBMP FileName$, X%, Y%, ErrCode%
  11535.  
  11536. FileName$   name of bitmap file
  11537. X%          X coordinate (0-319, or -1 for scaling)
  11538. Y%          Y coordinate (0-199, or -1 for scaling)
  11539. -------
  11540. ErrCode%    error code (0 if none; >0, DOS error; <0, bad .BMP)
  11541.  
  11542. Name  : ShowIcon             (Show Icon)
  11543. Class : Display File
  11544. Level : BIOS
  11545.  
  11546. This routine displays an icon file (MS Windows .ICO format) on
  11547. the screen. The display mode may be any of the EGA or VGA
  11548. graphics modes, and you can specify a starting X,Y coordinate.
  11549.  
  11550. Only the standard icon format is supported. These icons are
  11551. 32x32 pixels and are contained in 766-byte .ICO files. Note that
  11552. colors are translated from Windows colors, which are a close
  11553. (but not exact) match for BASIC colors.
  11554.  
  11555.    ShowIcon FileName$, X%, Y%, ErrCode%
  11556.  
  11557. FileName$   name of icon file
  11558. X%          X coordinate (0-319 or 0-639 depending on mode)
  11559. Y%          Y coordinate (0-199, -349, etc; depends on mode)
  11560. -------
  11561. ErrCode%    error code (0 if none; >0, DOS error; <0, not .ICO)
  11562.  
  11563. Name  : ShrSt                (Shift Right String of bits)
  11564. Class : String
  11565. Level : Any
  11566.  
  11567. This routine shifts the bits in a string right by a desired
  11568. amount. This may be helpful for manupulating strings containing
  11569. bit flags, images, et al.
  11570.  
  11571.    ShrSt St$, Count%
  11572.  
  11573. St$       string to shift right
  11574. Count%    bits by which to shift
  11575. -------
  11576. St$       shifted string
  11577.  
  11578. Name  : ShuffleSt            (Shuffle String)
  11579. Class : String
  11580. Level : Any
  11581.  
  11582. This routine shuffles the characters in a string, efficiently
  11583. randomizing their order. It relies on the RND function, so you'd
  11584. be advised to use the RANDOMIZE statement at the top of your
  11585. program unless you want the results to be predictable. A good
  11586. way of initializing the random number generator is:
  11587.  
  11588.    RANDOMIZE TIMER
  11589.  
  11590. See also the array shuffles: MatShuffleD, MatShuffleI,
  11591. MatShuffleL, MatShuffleS, MatShuffleSt
  11592.  
  11593.    ShuffleSt St$
  11594.  
  11595. St$       string to shuffle
  11596. -------
  11597. St$       shuffled string
  11598.  
  11599. Name  : SInput               (String Input)
  11600. Class : Input
  11601. Level : Clone
  11602.  
  11603. This is a flexible line input routine which supports WordStar
  11604. and DOS-style editing, default entries, key screening, and any
  11605. number of other options. To keep SInput manageable, the less
  11606. volatile parameters are set with separate routines instead of
  11607. being passed directly.
  11608.  
  11609. The St$ parameter must be set to the maximum desired input
  11610. length. It may also contain a default entry, in which case SLen%
  11611. should be set to the length of the default entry (set SLen% to
  11612. zero if there is no default entry).
  11613.  
  11614. Character screening is done through selection of valid character
  11615. types. This may be any combination of the following (add the
  11616. desired types together):
  11617.  
  11618.     1    letters
  11619.     2    digits
  11620.     4    symbols
  11621.    16    graphics (ASCII 128-255)
  11622.    32    spaces
  11623.  
  11624. You can use -1 to allow any character. You can also make use of
  11625. the NOT operator, e.g. NOT 2 allows everything but digits.
  11626.  
  11627. The ExitCode% returns the key used to terminate input. This will
  11628. normally be 13 (return) or 27 (esc), but other results may be
  11629. returned depending on how you use the various SInputSet
  11630. routines. Note that the cursor position is not altered when
  11631. SInput exits, to avoid accidentally scrolling your screen. You
  11632. are left with full control over the cursor.
  11633.  
  11634. The SInput routine is designed with the idea of input forms and
  11635. windows in mind. It is not capable of handling more than one
  11636. line of text at a time. It also doesn't know how to wrap at the
  11637. edge of the screen.
  11638.  
  11639. Routines in this series include:
  11640.    SInput, SInputSet, SInputSet1, SInputSet2
  11641.  
  11642. Since everyone has their own ideas about the perfect input
  11643. routine, I have recoded SInput largely in BASIC to allow you to
  11644. modify it easily. I've gotten a huge number of requests for
  11645. SInput modifications in the past; hopefully this will be the
  11646. best solution!
  11647.  
  11648.    SInput St$, SLen%, Valid%, MustFill%, VAttr%, ExitCode%
  11649.  
  11650. St$         init to max length of input (may hold default)
  11651. SLen%       length of default entry (0 if none)
  11652. Valid%      valid character types (see above)
  11653. MustFill%   whether input field must be totally filled (0 no)
  11654. VAttr%      color/attribute for input (see CalcAttr)
  11655. -------
  11656. St$         entered string
  11657. SLen%       length of entered string
  11658. ExitCode%   key used to exit (13 for <CR> or 27 for <ESC>)
  11659.  
  11660. Name  : SInputSet            (String Input Settings)
  11661. Class : Input
  11662. Level : Clone
  11663.  
  11664. This is one of a number of routines which allow you to modify
  11665. the default operation of SInput.
  11666.  
  11667. If you allow extended keys (like Alt keys and function keys) to
  11668. exit SInput, the ExitCode% parameter will return the negative
  11669. scan code of the key.
  11670.  
  11671. Routines in this series include:
  11672.    SInput, SInputSet, SInputSet1, SInputSet2
  11673.  
  11674.    SInputSet FillCh$, ExtExit%, BadBeep%, FullBeep%, Fast%
  11675.  
  11676. FillCh$     character used to show field length (default "_")
  11677. ExtExit%    extended keys can be used to exit (default 0, no)
  11678. BadBeep%    beep on invalid keys (default 0, no)
  11679. FullBeep%   beep when input field is full (default 0, no)
  11680. Fast%       use fast display, may make CGA flicker (def 0, no)
  11681.  
  11682. Name  : SInputSet1           (String Input Settings)
  11683. Class : Input
  11684. Level : Clone
  11685.  
  11686. This is one of a number of routines which allow you to modify
  11687. the default operation of SInput.
  11688.  
  11689. If you give SInput a default entry, it will normally place the
  11690. cursor at the end of that entry when input begins. The CurPosn%
  11691. option here allows you to place the cursor where you want it
  11692. (1 - LEN(St$), or 0 for end of entry).
  11693.  
  11694. Routines in this series include:
  11695.    SInput, SInputSet, SInputSet1, SInputSet2
  11696.  
  11697.    SInputSet1 CurPosn%, FullExit%
  11698.  
  11699. CurPosn%    starting cursor posn within input field (default 0)
  11700. FullExit%   auto-exit when input field is full (default 0, no)
  11701.  
  11702. Name  : SInputSet2           (String Input Settings)
  11703. Class : Input
  11704. Level : Clone
  11705.  
  11706. This is one of a number of routines which allow you to modify
  11707. the default operation of SInput.
  11708.  
  11709. If you allow tabs to exit SInput, the ExitCode% may return an
  11710. additional value: 9 (tab). A "back tab", by the way, can be
  11711. retrieved if you use SInputSet to allow extended keys to exit
  11712. (back tab would return -15).
  11713.  
  11714. Routines in this series include:
  11715.    SInput, SInputSet, SInputSet1, SInputSet2
  11716.  
  11717.    SInputSet2 Capitalize%, TabExit%
  11718.  
  11719. Capitalize%   whether to capitalize letters (default 0, no)
  11720. TabExit%      whether tab key can to exit (default 0, no)
  11721.  
  11722. Name  : SortD                (Sort Double precision)
  11723. Class : Array management
  11724. Level : Any
  11725.  
  11726. This routine sorts the elements in an array of double-precision
  11727. numbers.
  11728.  
  11729. The array is assumed to start at element 1. You may specify the
  11730. last element in the array, allowing you to sort only part of an
  11731. array if you like.
  11732.  
  11733. If you would like the results to be largest-to-smallest, rather
  11734. than smallest-to-largest, just call ReverseD after this routine.
  11735.  
  11736.    SortD Array#(), Elements%
  11737.  
  11738. Array#()    array to be sorted
  11739. Elements%   number of elements in array
  11740. -------
  11741. Array#()    sorted array
  11742.  
  11743. Name  : SortI                (Sort Integer)
  11744. Class : Array management
  11745. Level : Any
  11746.  
  11747. This routine sorts the elements in an array of integers.
  11748.  
  11749. The array is assumed to start at element 1. You may specify the
  11750. last element in the array, allowing you to sort only part of an
  11751. array if you like.
  11752.  
  11753. If you would like the results to be largest-to-smallest, rather
  11754. than smallest-to-largest, just call ReverseI after this routine.
  11755.  
  11756.    SortI Array%(), Elements%
  11757.  
  11758. Array%()    array to be sorted
  11759. Elements%   number of elements in array
  11760. -------
  11761. Array%()    sorted array
  11762.  
  11763. Name  : SortL                (Sort Long integer)
  11764. Class : Array management
  11765. Level : Any
  11766.  
  11767. This routine sorts the elements in an array of long integers.
  11768.  
  11769. The array is assumed to start at element 1. You may specify the
  11770. last element in the array, allowing you to sort only part of an
  11771. array if you like.
  11772.  
  11773. If you would like the results to be largest-to-smallest, rather
  11774. than smallest-to-largest, just call ReverseL after this routine.
  11775.  
  11776.    SortL Array&(), Elements%
  11777.  
  11778. Array&()    array to be sorted
  11779. Elements%   number of elements in array
  11780. -------
  11781. Array&()    sorted array
  11782.  
  11783. Name  : SortS                (Sort Single precision)
  11784. Class : Array management
  11785. Level : Any
  11786.  
  11787. This routine sorts the elements in an array of single-precision
  11788. numbers.
  11789.  
  11790. The array is assumed to start at element 1. You may specify the
  11791. last element in the array, allowing you to sort only part of an
  11792. array if you like.
  11793.  
  11794. If you would like the results to be largest-to-smallest, rather
  11795. than smallest-to-largest, just call ReverseS after this routine.
  11796.  
  11797.    SortS Array!(), Elements%
  11798.  
  11799. Array!()    array to be sorted
  11800. Elements%   number of elements in array
  11801. -------
  11802. Array!()    sorted array
  11803.  
  11804. Name  : SortSt               (Sort String)
  11805. Class : Array management
  11806. Level : Any
  11807.  
  11808. This routine sorts the elements in a string array.
  11809.  
  11810. The array is assumed to start at element 1. You may specify the
  11811. last element in the array, allowing you to sort only part of an
  11812. array if you like. You can also specify whether the
  11813. capitalization of letters in a string should matter for sorting
  11814. purposes.
  11815.  
  11816. If you would like the results to be last-to-first, rather than
  11817. first-to-last, just call ReverseSt after this routine.
  11818.  
  11819.    SortSt Array$(), Elements%, CapsCount%
  11820.  
  11821. Array$()    array to be sorted
  11822. CapsCount%  use 0 if uppercase/lowercase doesn't matter
  11823. Elements%   number of elements in array
  11824. -------
  11825. Array$()    sorted array
  11826.  
  11827. Name  : Soundex              (Soundex code)
  11828. Class : String
  11829. Level : Any
  11830.  
  11831. This is a string comparison routine which returns a code that is
  11832. loosely based on the "sound" of a word. It removes the vowels
  11833. and repeated characters from a word, then converts it into a
  11834. numeric code. Any words with the same code are considered to
  11835. sound alike.
  11836.  
  11837. While not perfect, this algorithm does a fast and reasonably
  11838. good job. It can be helpful in applications like spelling
  11839. checkers and phone books, where a search based on exact text may
  11840. not be appropriate.
  11841.  
  11842.    Code$ = St$
  11843.    Soundex St$, Code$, CodeLen%
  11844.    Code$ = LEFT$(St$, CodeLen%)
  11845.  
  11846. St$       string to be encoded
  11847. -------
  11848. Code$     result code.  Init to >= length of original string.
  11849. CodeLen%  length of the result code
  11850.  
  11851. Name  : SpeedKey             (Speed up Keyboard)
  11852. Class : Input
  11853. Level : BIOS (AT)
  11854.  
  11855. This routine provides control over the keyboard repeat rate for
  11856. AT-class machines. Increasing the repeat rate can make the
  11857. computer seem a lot more responsive and pleasant to deal with.
  11858.  
  11859.   RepDelay%   Delay Time
  11860.      0        250 milliseconds
  11861.      1        500 ms
  11862.      2        750 ms
  11863.      3        1 second
  11864.  
  11865.   RepRate% is the key repeat rate, 0-31 (from around 30 cps to
  11866.   around 2 cps)
  11867.  
  11868.    SpeedKey RepDelay%, RepRate%
  11869.  
  11870. RepDelay%   delay before starting to repeat (0-3, default 1)
  11871. RepRate%    rate at which to repeat key (0-31, default 11)
  11872.  
  11873. Name  : Split                (Split screen image)
  11874. Class : Display
  11875. Level : Clone
  11876.  
  11877. This provides an elegant way to clear a text-mode screen. It
  11878. splits the display into four parts, scrolling each part up or
  11879. down until it slides off the screen.
  11880.  
  11881.    Split
  11882.  
  11883. Name  : Spooler              (check for print Spooler)
  11884. Class : Printer
  11885. Level : DOS
  11886.  
  11887. The Spooler routine allows you to see whether the print spooler
  11888. (installed by the DOS PRINT utility) is available.
  11889.  
  11890.    Spooler Status%
  11891.  
  11892. -------
  11893. Status%   spooler status:
  11894.              -1   it's installed
  11895.               0   it isn't installed, but can be
  11896.               1   it isn't installed, and can't be
  11897.  
  11898. Name  : SSrch                (String Search)
  11899. Class : String
  11900. Level : Any
  11901.  
  11902. This is a string search routine which tells you whether one
  11903. string can be found inside another. Uppercase/lowercase
  11904. distinctions are ignored. Leading and trailing spaces in the
  11905. string for which to search are also ignored.
  11906.  
  11907. Note that the positions of the main string and search string
  11908. parameters are in the reverse of the order you might expect.
  11909.  
  11910.    SSrch Search$, MainSt$, Found%
  11911.  
  11912. Search$   string for which to search
  11913. MainSt$   string to be searched
  11914. -------
  11915. Found%    whether a match was found (0 if no)
  11916.  
  11917. Name  : StrDel               (String Delete)
  11918. Class : String
  11919. Level : Any
  11920.  
  11921. StrDel deletes a character from a string. Actually, it doesn't
  11922. make the string any shorter, but it acts like a delete. The end
  11923. of the string is filled with a space.
  11924.  
  11925.    StrDel St$, Posn%
  11926.  
  11927. St$       string from which to delete a character
  11928. Posn%     position of the character to delete (1-LEN(St$))
  11929. -------
  11930. St$       processed string
  11931.  
  11932. Name  : StrIns               (String Insert)
  11933. Class : String
  11934. Level : Any
  11935.  
  11936. StrIns inserts a space into a string. Actually, it doesn't make
  11937. the string any longer, but it acts like an insert. The former
  11938. end of the string is discarded.
  11939.  
  11940.    StrIns St$, Posn%
  11941.  
  11942. St$       string in which to insert a space
  11943. Posn%     where to insert the space (1-LEN(St$))
  11944. -------
  11945. St$       processed string
  11946.  
  11947. Name  : Strip                (Strip spaces)
  11948. Class : String
  11949. Level : Any
  11950.  
  11951. This routine strips both leading and trailing white space from a
  11952. string. This includes control characters as well as blanks
  11953. (anything below CHR$(33)).
  11954.  
  11955.    Strip St$
  11956.  
  11957. St$      string to process
  11958. -------
  11959. St$      processed string
  11960.  
  11961. Name  : Strip2$              (Strip Spaces)
  11962. Class : String
  11963. Level : Any
  11964.  
  11965. This routine strips both leading and trailing white space from a
  11966. string. It works just like Strip, but is a function rather than
  11967. a subprogram. White space includes control characters as well as
  11968. blanks (anything below CHR$(33)).
  11969.  
  11970.    Result$ = Strip2$(St$)
  11971.  
  11972. St$       string to process
  11973. -------
  11974. Result$   processed string
  11975.  
  11976. Name  : StripBlanks          (Strip Blanks)
  11977. Class : String
  11978. Level : Any
  11979.  
  11980. This routine strips leading and/or trailing white space from a
  11981. string. This includes control characters as well as blanks
  11982. (anything below CHR$(33)).
  11983.  
  11984. See also StripSpaces.
  11985.  
  11986.    StripBlanks St$, Which%, StLen%
  11987.    St$ = LEFT$(St$, StLen%)
  11988.  
  11989. St$      string to process
  11990. Which%   1: strip left, 2: strip right, 3: strip left and right
  11991. -------
  11992. St$      processed string
  11993. StLen    length of processed string
  11994.  
  11995. Name  : StripChar            (Strip Characters)
  11996. Class : String
  11997. Level : Any
  11998.  
  11999. This routine strips all occurrences of a given list of
  12000. characters out of a string. Among the uses for this are cleaning
  12001. up user-entered values. For instance, a strip list of "$," would
  12002. remove commas and dollar signs from a number, and "()- " will
  12003. remove telephone delimiters.
  12004.  
  12005.    StripChar St$, StripList$, StLen%
  12006.    St$ = LEFT$(St$, StLen%)
  12007.  
  12008. St$         string to process
  12009. StripList$  characters to remove from the string
  12010. -------
  12011. St$         processed string
  12012. StLen%      length of processed string
  12013.  
  12014. Name  : StripRange           (Strip Range of characters)
  12015. Class : String
  12016. Level : Any
  12017.  
  12018. This routine strips an inclusive range of characters out of a
  12019. string. The range is specified as the first and last ASCII codes
  12020. to strip. For instance, using a low character of "0" and a high
  12021. of "9" would remove all digits from a string.
  12022.  
  12023.    StripRange St$, ASC(LowChar$), ASC(HighChar$), StLen%
  12024.    St$ = LEFT$(St$, StLen%)
  12025.  
  12026. St$         string to process
  12027. LowChar$    lowest character to strip
  12028. HighChar$   highest character to strip
  12029. -------
  12030. St$         processed string
  12031. StLen%      length of processed string
  12032.  
  12033. Name  : StripSpaces          (Strip Spaces)
  12034. Class : String
  12035. Level : Any
  12036.  
  12037. This routine strips leading and/or trailing spaces from a
  12038. string.
  12039.  
  12040. See also StripBlanks.
  12041.  
  12042.    StripSpaces St$, Which%, StLen%
  12043.    St$ = LEFT$(St$, StLen%)
  12044.  
  12045. St$      string to process
  12046. Which%   1: strip left, 2: strip right, 3: strip left and right
  12047. -------
  12048. St$      processed string
  12049. StLen%   length of processed string
  12050.  
  12051. Name  : StrSqu$              (String Squish)
  12052. Class : String
  12053. Level : Any
  12054.  
  12055. This is a text compression routine which uses 2-gram and 3-gram
  12056. compression to shrink a string. It combines the best of the
  12057. StrSqu2 and StrSqu3 routines with additional ease of use. The
  12058. one limitation is that only plain text may be compressed; the
  12059. text may not contain CHR$(128) through CHR$(255), as these codes
  12060. are used by the compression algorithm.
  12061.  
  12062. The compressed text can be restored to original form with the
  12063. StrUnsq$ function.
  12064.  
  12065.    Result$ = StrSqu$(St$)
  12066.  
  12067. St$       string to compress
  12068. -------
  12069. Result$   compressed string
  12070.  
  12071. Name  : StrSqu2              (String Squish, 2-gram)
  12072. Class : String
  12073. Level : Any
  12074.  
  12075. This is a text compression routine which uses a 2-gram algorithm
  12076. to compress common pairs of characters out of a string. You can
  12077. reasonably expect to reduce the text size by about a third with
  12078. this routine. Compression is quite fast. The one limitation is
  12079. that only plain text may be compressed; the text may not contain
  12080. CHR$(128) through CHR$(255), as these codes are used by the
  12081. compression algorithm.
  12082.  
  12083. You must use StrSquLen2 before this routine to determine the
  12084. proper length to which to initialize the result string.
  12085.  
  12086. The compressed text can be restored to original form with
  12087. StrUnsqu2.
  12088.  
  12089.    StrSquLen2 St$, ResultLen%
  12090.    Result$ = SPACE$(ResultLen%)
  12091.    StrSqu2 St$, Result$
  12092.  
  12093. St$       string to compress
  12094. -------
  12095. Result$   compressed string
  12096.  
  12097. Name  : StrSqu3              (String Squish, 3-gram)
  12098. Class : String
  12099. Level : Any
  12100.  
  12101. This is a text compression routine which uses a 3-gram algorithm
  12102. to compress common triplets of characters out of a string. You
  12103. can reasonably expect to reduce the text size by about a third
  12104. with this routine. Compression is quite fast. The one limitation
  12105. is that only plain text may be compressed; the text may not
  12106. contain CHR$(128) through CHR$(255), as these codes are used by
  12107. the compression algorithm.
  12108.  
  12109. You must use StrSquLen3 before this routine to determine the
  12110. proper length to which to initialize the result string.
  12111.  
  12112. The compressed text can be restored to original form with
  12113. StrUnsqu3.
  12114.  
  12115.    StrSquLen3 St$, ResultLen%
  12116.    Result$ = SPACE$(ResultLen%)
  12117.    StrSqu3 St$, Result$
  12118.  
  12119. St$       string to compress
  12120. -------
  12121. Result$   compressed string
  12122.  
  12123. Name  : StrSquLen2           (String Squished Length, 2-gram)
  12124. Class : String
  12125. Level : Any
  12126.  
  12127. This routine is used in conjunction with the StrSqu2 text
  12128. compressor. It tells you what size the resulting text will be.
  12129. See StrSqu2 for further information.
  12130.  
  12131.    StrSquLen2 St$, ResultLen%
  12132.    Result$ = SPACE$(ResultLen%)
  12133.    StrSqu2 St$, Result$
  12134.  
  12135. St$          string to compress
  12136. -------
  12137. ResultLen%   length of the compressed string
  12138.  
  12139. Name  : StrSquLen3           (String Squished Length, 3-gram)
  12140. Class : String
  12141. Level : Any
  12142.  
  12143. This routine is used in conjunction with the StrSqu3 text
  12144. compressor. It tells you what size the resulting text will be.
  12145. See StrSqu3 for further information.
  12146.  
  12147.    StrSquLen3 St$, ResultLen%
  12148.    Result$ = SPACE$(ResultLen%)
  12149.    StrSqu3 St$, Result$
  12150.  
  12151. St$          string to compress
  12152. -------
  12153. ResultLen%   length of the compressed string
  12154.  
  12155. Name  : StrUnsq$             (String Unsquish)
  12156. Class : String
  12157. Level : Any
  12158.  
  12159. This routine decompresses text which was compressed by the
  12160. StrSqu$ function.
  12161.  
  12162.    Result$ = StrUnsq$(St$)
  12163.  
  12164. St$       string to decompress
  12165. -------
  12166. Result$   decompressed string
  12167.  
  12168. Name  : StrUnsqu2            (String Unsquish, 2-gram)
  12169. Class : String
  12170. Level : Any
  12171.  
  12172. This routine decompresses text which was compressed by StrSqu2.
  12173. Text is decompressed at lightning speed, as this routine has no
  12174. overhead to speak of.
  12175.  
  12176. You must use StrUnsquLen2 before this routine to determine the
  12177. proper length to which to initialize the result string.
  12178.  
  12179.    StrUnsquLen2 St$, ResultLen%
  12180.    Result$ = SPACE$(ResultLen%)
  12181.    StrUnsqu2 St$, Result$
  12182.  
  12183. St$       string to decompress
  12184. -------
  12185. Result$   decompressed string
  12186.  
  12187. Name  : StrUnsqu3            (String Unsquish, 3-gram)
  12188. Class : String
  12189. Level : Any
  12190.  
  12191. This routine decompresses text which was compressed by StrSqu3.
  12192. Text is decompressed at lightning speed, as this routine has no
  12193. overhead to speak of.
  12194.  
  12195. You must use StrUnsquLen3 before this routine to determine the
  12196. proper length to which to initialize the result string.
  12197.  
  12198.    StrUnsquLen3 St$, ResultLen%
  12199.    Result$ = SPACE$(ResultLen%)
  12200.    StrUnsqu3 St$, Result$
  12201.  
  12202. St$       string to decompress
  12203. -------
  12204. Result$   decompressed string
  12205.  
  12206. Name  : StrUnsquLen2         (String Unsquished Length, 2-gram)
  12207. Class : String
  12208. Level : Any
  12209.  
  12210. This routine is used in conjunction with the StrUnsqu2 text
  12211. decompressor. It tells you what size the resulting text will be.
  12212. See StrUnsqu2 for further information.
  12213.  
  12214.    StrUnsquLen2 St$, ResultLen%
  12215.    Result$ = SPACE$(ResultLen%)
  12216.    StrUnsqu2 St$, Result$
  12217.  
  12218. St$          string to decompress
  12219. -------
  12220. ResultLen%   length of the decompressed string
  12221.  
  12222. Name  : StrUnsquLen3         (String Unsquished Length, 3-gram)
  12223. Class : String
  12224. Level : Any
  12225.  
  12226. This routine is used in conjunction with the StrUnsqu3 text
  12227. decompressor. It tells you what size the resulting text will be.
  12228. See StrUnsqu3 for further information.
  12229.  
  12230.    StrUnsquLen3 St$, ResultLen%
  12231.    Result$ = SPACE$(ResultLen%)
  12232.    StrUnsqu3 St$, Result$
  12233.  
  12234. St$          string to decompress
  12235. -------
  12236. ResultLen%   length of the decompressed string
  12237.  
  12238. Name  : SubExist             (Subdirectory Existence)
  12239. Class : Disk
  12240. Level : DOS
  12241.  
  12242. This routine lets you see if a given drive and/or subdirectory
  12243. actually exists.
  12244.  
  12245. See also SubExist2, the FUNCTION version of this routine.
  12246.  
  12247.    SubExist SubDir$, Found%
  12248.  
  12249. SubDir$   name of the path to check
  12250. -------
  12251. Found%    whether the path exists (0 if no, -1 if yes)
  12252.  
  12253. Name  : SubExist2%           (Subdirectory Existence)
  12254. Class : Disk
  12255. Level : DOS
  12256.  
  12257. This routine lets you see if a given drive and/or subdirectory
  12258. actually exists.
  12259.  
  12260. See also SubExist, the SUB version of this routine.
  12261.  
  12262.    Found% = SubExist2%(SubDir$)
  12263.  
  12264. SubDir$   name of the path to check
  12265. -------
  12266. Found%    whether the path exists (0 if no, -1 if yes)
  12267.  
  12268. Name  : Time2Int             (Time to Integer)
  12269. Class : Time
  12270. Level : Any
  12271.  
  12272. This routine compresses a time into a single integer. Note that
  12273. this integer is not in a format that lends itself to simple
  12274. computation-- you cannot subtract one from another to find out
  12275. the length of time between them. If that's what you want, try
  12276. the Elapsed routine.
  12277.  
  12278. Note that odd numbers of seconds will be rounded down to the
  12279. previous even number. This is a result of the storage format
  12280. used.
  12281.  
  12282.    Time2Int HourNr%, MinuteNr%, SecondNr%, IntTimeNr%
  12283.  
  12284. HourNr%      hour (0-23)
  12285. MinuteNr%    minute
  12286. SecondNr%    second
  12287. -------
  12288. IntTime%     time compressed into an integer
  12289.  
  12290. Name  : Time2Sec&            (Time to Seconds)
  12291. Class : Time
  12292. Level : Any
  12293.  
  12294. This routine converts a time string into the number of seconds
  12295. past midnight. This is convenient if you want to find the
  12296. difference between two times or to calculate what time it will
  12297. be after a given interval.
  12298.  
  12299.    Seconds& = Time2Sec&(TimeSt$)
  12300.  
  12301. TimeSt$    time string (TIME$ format)
  12302. -------
  12303. Seconds&   number of seconds past midnight
  12304.  
  12305. Name  : TimeN2S              (Time Numbers to String)
  12306. Class : Time
  12307. Level : Any / DOS
  12308.  
  12309. Many of the PBClone routines return the time as a set of
  12310. numbers. This routine provides an easy way to convert those
  12311. numbers into string form. The time format used (whether seconds
  12312. are included) will be based on the length of the string which
  12313. you pass to the routine. For instance, a string like "xx:xx"
  12314. would return a time like "21:35", whereas "xx:xx:xx" would
  12315. return "21:35:08".
  12316.  
  12317.    TimeSt$ = "xx:xx:xx"
  12318.    TimeN2S HourNr%, MinuteNr%, SecondNr%, TimeSt$
  12319.  
  12320. HourNr%     hour (0-23)
  12321. MinuteNr%   minute
  12322. SecondNr%   second
  12323. -------
  12324. TimeSt$     time string.  Init to 5 or 8 characters (see above).
  12325.  
  12326. Name  : TimeS2N              (Time String to Numbers)
  12327. Class : Time
  12328. Level : Any
  12329.  
  12330. Many of the PBClone routines need to be passed the time as a set
  12331. of numbers. This routine provides an easy way to convert a time
  12332. from string form into numbers. You may use either "xx:xx:xx" or
  12333. "xx:xx" form to specify the time (the string length is
  12334. important, but the delimiter and contents of the string are
  12335. ignored). If the 5-character short form is used, the Second%
  12336. value will be zero.
  12337.  
  12338.    TimeS2N HourNr%, MinuteNr%, SecondNr%, TimeSt$
  12339.  
  12340. TimeSt$     time string.  Init to 5 or 8 characters (see above).
  12341. -------
  12342. HourNr%     hour (0-23)
  12343. MinuteNr%   minute
  12344. SecondNr%   second (0 if 5-char format)
  12345.  
  12346. Name  : TInstr               (Typed INSTR)
  12347. Class : String
  12348. Level : Any
  12349.  
  12350. As you might guess from the "Instr" part of the name, this
  12351. routine searches a string. Instead of searching for a specific
  12352. character or substring, though, it looks for a specific type of
  12353. character-- letters, numbers, control codes, or whatever. You
  12354. can search for the first of a combination of types, too, which
  12355. also allows searching for "anything but" a specific type.
  12356.  
  12357. The character type code is specified by adding any of the
  12358. following:
  12359.  
  12360.     1    alphabetic
  12361.     2    numeric
  12362.     4    symbolic
  12363.     8    control
  12364.    16    graphics
  12365.    32    space
  12366.  
  12367. The TInstr routine is handy for parsing and cleaning up user
  12368. input, among other uses.
  12369.  
  12370.    TInstr St$, ChrType%, Place%
  12371.  
  12372. St$          string to search
  12373. ChrType%     type of character(s) to search for
  12374. -------
  12375. Place%       position of first char of desired type, or 0
  12376.  
  12377. Name  : ToPostal$            (To Postal Abbreviation)
  12378. Class : String
  12379. Level : Any
  12380.  
  12381. This function returns the two-letter U.S. postal abbreviation
  12382. corresponding to a given place name. It handles all valid
  12383. abbreviations, including states (e.g., "AZ" = "Arizona") and a
  12384. number of other countries (e.g., "PR" = "Puerto Rico").
  12385.  
  12386. A null string ("") is returned if the specified place can't be
  12387. abbreviated. Capitalization is not important, but spelling is.
  12388. This function is best used with validated input. If you have
  12389. control of the input method, consider using a "pick list" menu.
  12390. Otherwise, a fuzzy scanner would be appropriate, using perhaps
  12391. the Bickel and/or Soundex routines to find the closest match if
  12392. a perfect match is not found.
  12393.  
  12394. The conversion can also be done the other way around-- see the
  12395. FromPostal$ function.
  12396.  
  12397.    Abbrev$ = ToPostal$(PlaceName$)
  12398.  
  12399. PlaceName$   place name to abbreviate
  12400. -------
  12401. Abbrev$      two-letter postal abbreviation
  12402.  
  12403. Name  : TVIdle               (TopView Idle)
  12404. Class : Miscellaneous
  12405. Level : BIOS
  12406.  
  12407. If your program is running under TopView or a compatible
  12408. multitasker, such as DESQview, it can take advantage of this
  12409. routine to give up the rest of its time slice. This would
  12410. normally done at a point where the program is liable to be idle
  12411. for a brief while, such as during user input.
  12412.  
  12413. The advantage of giving up part of your program's time when you
  12414. can afford it is that any other running programs will be able to
  12415. make use of it, hence improving overall system performance.
  12416.  
  12417.    TVIdle
  12418.  
  12419. Name  : TypeIn               (Type In)
  12420. Class : Input
  12421. Level : Clone
  12422.  
  12423. This is an unusual routine which combines both output and input.
  12424. It sends a string to the keyboard buffer, where it acts as if it
  12425. had been typed in by someone. The string may be up to 15 key
  12426. codes in length (anything past 15 keys will be ignored, due to
  12427. the limited length of the keyboard buffer).
  12428.  
  12429. Normal keys can be put into the string simply as characters.
  12430. Extended keys, like Alt-key combinations, arrow keys, and
  12431. function keys, must be encoded as CHR$(0) + CHR$(ScanCode),
  12432. where the ScanCode is the key's scan code. You can look up such
  12433. scan codes in your BASIC manual or use GetKey to find out what
  12434. they are. Extended keys, although apparently taking up two
  12435. characters, only take up one space in the keyboard buffer. The
  12436. TypeIn routine allows for this fact.
  12437.  
  12438. Among other things, this routine can be used to provide default
  12439. answers to input routines, or to execute another program once
  12440. your program exits.
  12441.  
  12442.    TypeIn St$
  12443.  
  12444. St$     keys to be "typed" into the keyboard buffer
  12445.  
  12446. Name  : TypePrint            (Type Print)
  12447. Class : Display
  12448. Level : Clone
  12449.  
  12450. TypePrint displays a string as if it was being typed. The string
  12451. is displayed a character at a time, with a delay between each
  12452. character. You may choose one color to highlight the
  12453. just-displayed character and another color for the character to
  12454. turn after the delay is done.
  12455.  
  12456.    TypePrint St$, Row%, Column%, WaitTime%, TmpAttr%, _
  12457.       VAttr%, Fast%
  12458.  
  12459. St$        string to display
  12460. Row%       row at which to display string
  12461. Column%    column at which to display string
  12462. WaitTime%  delay between chars (milliseconds; 20-60 is decent)
  12463. TmpAttr%   color/attribute for just-displayed character
  12464. VAttr%     color/attribute for character after the delay is up
  12465. Fast%      whether to use fast displays (0 no)
  12466.  
  12467. Name  : UnCalcAttr           (Undo Calculated Attribute)
  12468. Class : Display
  12469. Level : Any
  12470.  
  12471. Many of the display routines in this library require an
  12472. "attribute" rather than foreground and background colors. An
  12473. attribute is a combination of the foreground and background
  12474. colors in a format which is used by all types of displays when
  12475. in text mode. The UnCalcAttr routine allows you to decode the
  12476. original colors given the attribute.
  12477.  
  12478. Foreground colors are usually specified as 0-31, with
  12479. backgrounds as 0-7. If you turn blinking off (see Blink), it may
  12480. be more convenient to express the same thing as foreground 0-15,
  12481. background 0-15. The CalcAttr routine will accept either way of
  12482. expressing it.
  12483.  
  12484. Note, however, that UnCalcAttr will always return the former
  12485. pair of results, since it has no way of knowing whether Blink
  12486. has been used (foreground 0-31, background 0-15). The below
  12487. routine shows how to get around this, if needed.
  12488.  
  12489.    UnCalcAttr Foreground%, Background%, VAttr%
  12490.    ' the following is optional and may not be desired...
  12491.    ' it converts colors to "no blink" equivalents (see above)
  12492.    IF Foreground% AND 16 THEN
  12493.       Foreground% = Foreground% - 16
  12494.       Background% = Background% + 8
  12495.    END IF
  12496.  
  12497. VAttr%        color "attribute"
  12498. -------
  12499. Foreground%   foreground color
  12500. Background%   background color
  12501.  
  12502. Name  : UnSCrunch            (Undo Screen Crunch)
  12503. Class : Display
  12504. Level : Any
  12505.  
  12506. This routine is designed to be used in conjunction with ScrRest
  12507. and the other routines which restore an entire 80x25 text screen
  12508. from an array. It expands screens that were compressed by
  12509. SCrunch to their full original size. The uncompression algorithm
  12510. is very fast and will not take any noticeable amount of time for
  12511. most purposes.
  12512.  
  12513. If your original screen was not 80x25 in size, use the
  12514. UnSCrunchSS routine instead.
  12515.  
  12516.    REDIM FullScreen%(1 TO 2000)
  12517.    DSeg% = VARSEG(FullScreen%(1))
  12518.    DOfs% = VARPTR(FullScreen%(1))
  12519.    UnSCrunch DSeg%, DOfs%, CSeg%, COfs%
  12520.  
  12521. DSeg%     segment of array in which to store expanded image
  12522. DOfs%     offset of array in which to store expanded image
  12523. CSeg%     segment of the compressed image
  12524. COfs%     offset of the compressed image
  12525.  
  12526. Name  : UnSCrunchSS          (Undo Screen Crunch Sized Screen)
  12527. Class : Display
  12528. Level : Any
  12529.  
  12530. This routine is designed to be used in conjunction with ScrRest
  12531. and the other routines which restore a text screen from an
  12532. array. It expands screens that were compressed by SCrunchSS or
  12533. SCrunch to their full original size. The uncompression algorithm
  12534. is very fast and will not take any noticeable amount of time for
  12535. most purposes.
  12536.  
  12537. If your original screen was 80x25 in size, you may find it
  12538. convenient to use the UnSCrunch routine instead.
  12539.  
  12540.    REDIM FullScreen%(1 TO Rows% * Cols%)
  12541.    DSeg% = VARSEG(FullScreen%(1))
  12542.    DOfs% = VARPTR(FullScreen%(1))
  12543.    UnSCrunchSS DSeg%, DOfs%, Rows%, Cols%, CSeg%, COfs%
  12544.  
  12545. DSeg%     segment of array in which to store expanded image
  12546. DOfs%     offset of array in which to store expanded image
  12547. Rows%     rows in image
  12548. Cols%     columns in image
  12549. CSeg%     segment of the compressed image
  12550. COfs%     offset of the compressed image
  12551.  
  12552. Name  : UnSplit              (Undo Split)
  12553. Class : Display
  12554. Level : Clone
  12555.  
  12556. This routine does the opposite of Split-- instead of clearing
  12557. the screen by scrolling it in different directions, it puts text
  12558. on the screen by scrolling it on from different locations. The
  12559. effect is quite stunning.
  12560.  
  12561. The information to place on the screen comes from an array that
  12562. you specify which contains a saved screen. Only 80x25 text modes
  12563. are supported. Any of the screen save routines (e.g., ScrSave)
  12564. may be used to load the array. In a typical case, you will use
  12565. this routine with screens that were created in advance and
  12566. stored to disk for use by your program.
  12567.  
  12568.    UnSplit Scrn%(), Fast%
  12569.  
  12570. Scrn%()   array containing the text to display
  12571. Fast%     whether to use fast mode (0 no)
  12572.  
  12573. Name  : Upcase               (Uppercase)
  12574. Class : String
  12575. Level : Any
  12576.  
  12577. This routine, like BASIC's UCASE$ function, converts a string to
  12578. uppercase. Since it doesn't have to create a new return string
  12579. (a fairly slow process), it's faster than the BASIC equivalent.
  12580.  
  12581. The Upcase routine is designed for the U.S. character set. If
  12582. your program is intended for distribution, you would be well
  12583. advised to use Upcase1 instead, as it supports international
  12584. character sets.
  12585.  
  12586.    Upcase St$
  12587.  
  12588. St$     string to be capitalized
  12589. -------
  12590. St$     capitalized string
  12591.  
  12592. Name  : Upcase1              (Uppercase)
  12593. Class : String
  12594. Level : DOS
  12595.  
  12596. This routine, like BASIC's UCASE$ function, converts a string to
  12597. uppercase. It converts letters in the extended character set as
  12598. well as the usual letters, making it well suited for text which
  12599. may not be in English.
  12600.  
  12601. Note that DOS 5.0 is required for optimal performance. With
  12602. older DOS versions, this routine makes assumptions about the
  12603. character set which may not be appropriate.
  12604.  
  12605.    Upcase1 St$
  12606.  
  12607. St$     string to be capitalized
  12608. -------
  12609. St$     capitalized string
  12610.  
  12611. Name  : UpcaseI%             (Uppercase Integer char)
  12612. Class : Numeric
  12613. Level : Any
  12614.  
  12615. This function converts a character to uppercase. Rather than
  12616. taking a string parameter, though, UpcaseI% works on an integer
  12617. which contains an ASCII code.
  12618.  
  12619. The UpcaseI% function is designed for the U.S. character set. If
  12620. your program is intended for distribution, you would be well
  12621. advised to use UpcaseI1% instead, as it supports international
  12622. character sets.
  12623.  
  12624.    CapCh% = UpcaseI%(Ch%)
  12625.  
  12626. Ch%      character to be capitalized
  12627. -------
  12628. CapCh%   capitalized character
  12629.  
  12630. Name  : UpcaseI1%            (Uppercase Integer char)
  12631. Class : Numeric
  12632. Level : DOS
  12633.  
  12634. This function converts a character to uppercase. Rather than
  12635. taking a string parameter, though, UpcaseI% works on an integer
  12636. which contains an ASCII code.
  12637.  
  12638. Note that DOS 5.0 is required for optimal performance. With
  12639. older DOS versions, this routine makes assumptions about the
  12640. character set which may not be appropriate.
  12641.  
  12642.    CapCh% = UpcaseI1%(Ch%)
  12643.  
  12644. Ch%      character to be capitalized
  12645. -------
  12646. CapCh%   capitalized character
  12647.  
  12648. Name  : UpdTVScreen          (Update TopView Screen)
  12649. Class : Display
  12650. Level : BIOS
  12651.  
  12652. UpdTVScreen tells a TopView-compatible multitasker to update the
  12653. screen using a specified screen buffer (use GetTVScreen to get
  12654. the buffer location). Some multitaskers will do this
  12655. automatically, but some won't. It's safe to use this routine
  12656. either way.
  12657.  
  12658. See also GetDView, GetTView, GetTVScreen.
  12659.  
  12660.    UpdTVScreen DSeg%, DOfs%
  12661.  
  12662. DSeg%       segment of screen buffer
  12663. DOfs%       offset of screen buffer
  12664.  
  12665. Name  : ValidSt%             (Valid String)
  12666. Class : String
  12667. Level : Any
  12668.  
  12669. This function is used for string validation. It lets you make
  12670. sure that a string contains only approved characters. If the
  12671. string contains any characters that aren't in the approved list,
  12672. 0 is returned; otherwise, -1 is returned.
  12673.  
  12674.    IsValid% = ValidSt%(St$, GoodCh$)
  12675.  
  12676. St$          string to validate
  12677. GoodCh$      characters which may be in the string
  12678. -------
  12679. IsValid%     whether the string is valid (0 no, -1 yes)
  12680.  
  12681. Name  : VerticalPrint        (Vertical Print)
  12682. Class : Display
  12683. Level : Clone
  12684.  
  12685. This routine displays a string in a column, from top to bottom,
  12686. rather than from left to right. Display handling is done in
  12687. BASIC, so all SCREEN modes work, and the cursor is updated
  12688. appropriately.
  12689.  
  12690.    VerticalPrint St$
  12691.  
  12692. St$       string to display
  12693.  
  12694. Name  : VGARest13            (VGA Restore for SCREEN 13)
  12695. Class : Display
  12696. Level : Clone
  12697.  
  12698. This routine allows you to restore a SCREEN 13 (VGA, 320x200,
  12699. 256 color) display that was saved using VGASave13 (see).
  12700.  
  12701.    VGARest13 DSeg%, DOfs%
  12702.  
  12703. DSeg%        segment of storage array, returned by VARSEG
  12704. DOfs%        offset  of storage array, returned by VARPTR
  12705.  
  12706. Name  : VGASave13            (VGA Save of SCREEN 13)
  12707. Class : Display
  12708. Level : Clone
  12709.  
  12710. This routine allows you to save a SCREEN 13 (VGA, 320x200, 256
  12711. color) display that can be restored using VGARest13 (see).
  12712.  
  12713. The array used to hold the screen must contain 64,000 bytes. For
  12714. an integer array, this means that you must create the array by
  12715. DIM Array%(1 TO 32000).
  12716.  
  12717.    VGASave13 DSeg%, DOfs%
  12718.  
  12719. DSeg%        segment of storage array, returned by VARSEG
  12720. DOfs%        offset  of storage array, returned by VARPTR
  12721.  
  12722. Name  : Weekday0             (Weekday)
  12723. Class : Time
  12724. Level : DOS
  12725.  
  12726. This routine tells you what the day of the week is, just the
  12727. thing for calendar programs and whatnot. The day is returned as
  12728. a number from 1-7, which identifies a day from Sunday through
  12729. Saturday.
  12730.  
  12731.    Weekday0 DayNr%
  12732.  
  12733. -------
  12734. DayNr%     current day
  12735.  
  12736. Name  : Weekday1             (Weekday)
  12737. Class : Time
  12738. Level : Any
  12739.  
  12740. This routine tells you the day of the week for any given date. A
  12741. shortcut is available if you just want the day of the week for
  12742. today's date-- use zero (or less) for the MonthNr% or DayNr%
  12743. values.
  12744.  
  12745.    Weekday1 MonthNr%, DayNr%, YearNr%, DayName$
  12746.  
  12747. MonthNr%     month number (1-12)
  12748. DayNr%       day number (1-31)
  12749. YearNr%      year number (1900 on)
  12750. -------
  12751. DayName$     day of the week (e.g., "Tuesday")
  12752.  
  12753. Name  : WinCheck             (Windows Check)
  12754. Class : Equipment
  12755. Level : BIOS
  12756.  
  12757. The WinCheck routine tells you what version of Microsoft Windows
  12758. is in use, if any. It returns the results as two integers
  12759. containing the major and minor version numbers. For instance,
  12760. Windows 3.0 would return a major number of 3, minor 0.
  12761. Windows/386 v2.x will be identified as 2.0. If Windows is not
  12762. running, 0.0 will be returned. NOTE that this routine is not
  12763. able to detect Windows 1.x versions!
  12764.  
  12765.    WinCheck MajorV%, MinorV%
  12766.  
  12767. -------
  12768. MajorV%   major part of the Windows version
  12769. MinorV%   minor part of the Windows version
  12770.  
  12771. Name  : WindowMan2           (Window Manager)
  12772. Class : Display
  12773. Level : Clone
  12774.  
  12775. This routine is identical to WindowManager but for the fact that
  12776. it allows you to design your own custom window frames. Please
  12777. see the description of WindowManager for general information.
  12778.  
  12779. These are the additional frame types:
  12780.     6   custom frame composed of a single character
  12781.     7   custom frame composed of the specified 7-character list:
  12782.         top left corner, top middle, top right corner,
  12783.         left middle, right middle,
  12784.         bottom left corner, bottom middle, bottom right corner
  12785.  
  12786.  /------------------------------------------------------------\
  12787.  | A custom frame like this would be defined as frame type 7, |
  12788.  | with a frame string of "/-\||\-/", for instance.           |
  12789.  \------------------------------------------------------------/
  12790.  
  12791.  *************************************************
  12792.  * On the other hand, a frame like this would be *
  12793.  * frame type 6, with a frame string of "*".     *
  12794.  *************************************************
  12795.  
  12796. Note that this routine differs from the ProBas equivalent in
  12797. that it supports full frame definitions through frame type 7.
  12798. Differences mentioned under WindowManager are also relevant.
  12799.  
  12800.    WindowMan2 TRow%, LCol%, BRow%, RCol%, Frame%, FSt$,
  12801.       Fore%, Back%, Grow%, Shade%, TFore%, Title$, Page%, Fast%
  12802.  
  12803. TRow%       top row of window
  12804. LCol%       left column of window
  12805. BRow%       bottom row of window
  12806. RCol%       right column of window
  12807. Frame%      frame type (see above)
  12808. FSt$        frame definition string (see above)
  12809. Fore%       frame foreground color
  12810. Back%       frame background color
  12811. Grow%       window growing option (see above)
  12812. Shade%      window shadow option (see above)
  12813. TFore%      title foreground color
  12814. Title$      window title ("" if none)
  12815. Page%       display page (normally zero)
  12816. Fast%       whether to use fast mode (0 no)
  12817.  
  12818. Name  : WindowMan3           (Window Manager)
  12819. Class : Display
  12820. Level : Clone
  12821.  
  12822. This routine is identical in function to WindowManager. The
  12823. parameters are mostly passed as an array, however, instead of
  12824. one by one. Please see the description of WindowManager for
  12825. general information.
  12826.  
  12827.    WindowMan3 Parm%(), Title$
  12828.  
  12829. Parm%(1)    top row of window
  12830. Parm%(2)    left column of window
  12831. Parm%(3)    bottom row of window
  12832. Parm%(4)    right column of window
  12833. Parm%(5)    frame type (see above)
  12834. Parm%(6)    frame foreground color
  12835. Parm%(7)    frame background color
  12836. Parm%(8)    window growing option (see above)
  12837. Parm%(9)    window shadow option (see above)
  12838. Parm%(10)   title foreground color
  12839. Parm%(11)   display page (normally zero)
  12840. Parm%(12)   whether to use fast mode (0 no)
  12841. Title$      window title ("" if none)
  12842.  
  12843. Name  : WindowMan4           (Window Manager)
  12844. Class : Display
  12845. Level : Clone
  12846.  
  12847. This is an extremely cut-down version of WindowManager,
  12848. providing no more than a simple frame generator.
  12849.  
  12850. These are the available frame types:
  12851.     0   no frame
  12852.     1   single lines
  12853.     2   double lines
  12854.     3   single horizontal, double vertical lines
  12855.     4   double horizontal, single vertical lines
  12856.     5   block graphic lines
  12857.  
  12858.    WindowMan4 TRow%, LCol%, BRow%, RCol%, Frame%, VAttr%, _
  12859.       Page%, Fast%
  12860.  
  12861. TRow%       top row of window
  12862. LCol%       left column of window
  12863. BRow%       bottom row of window
  12864. RCol%       right column of window
  12865. Frame%      frame type (see above)
  12866. VAttr%      frame color/attribute (use CalcAttr)
  12867. Page%       display page (normally zero)
  12868. Fast%       whether to use fast mode (0 if no, to avoid snow on CGAs)
  12869.  
  12870. Name  : WindowManager        (Window Manager)
  12871. Class : Display
  12872. Level : Clone
  12873.  
  12874. WindowManager displays a pop-up window according to your
  12875. specifications. The window may have any of a variety of frames,
  12876. a title, or a shadow, and it may appear instantly or "grow" onto
  12877. the screen. Only text mode is supported.
  12878.  
  12879. These are the available frame types:
  12880.     0   no frame
  12881.     1   single lines
  12882.     2   double lines
  12883.     3   single horizontal, double vertical lines
  12884.     4   double horizontal, single vertical lines
  12885.     5   block graphic lines
  12886.  
  12887. These are the available shadows:
  12888.    -3   transparent shadow on the right
  12889.    -2   transparent shadow on the left
  12890.    -1   solid black shadow on the left
  12891.     0   no shadow
  12892.    1+   shadow attribute (use CalcAttr) for a colored shadow
  12893.  
  12894. Options for growing windows are as follows:
  12895.    -1   grow as fast as possible
  12896.     0   pop onto the screen
  12897.    1+   grow with delay given in milliseconds (15 works for me)
  12898.  
  12899. Note that this routine is different from its ProBas equivalent
  12900. in a number of respects. The grow delay time is different.
  12901. Growing is done more smoothly. The shadow and title parameters
  12902. are not changed by this routine. A new frame type (5) was added.
  12903. If a title is too long, it is truncated instead of being ignored
  12904. completely. Using a -1 as the title foreground color will not
  12905. turn off the title; instead, use a null title string.
  12906.  
  12907.    WindowManager TRow%, LCol%, BRow%, RCol%, Frame%,
  12908.       Fore%, Back%, Grow%, Shade%, TFore%, Title$, Page%, Fast%
  12909.  
  12910. TRow%       top row of window
  12911. LCol%       left column of window
  12912. BRow%       bottom row of window
  12913. RCol%       right column of window
  12914. Frame%      frame type (see above)
  12915. Fore%       frame foreground color
  12916. Back%       frame background color
  12917. Grow%       window growing option (see above)
  12918. Shade%      window shadow option (see above)
  12919. TFore%      title foreground color
  12920. Title$      window title ("" if none)
  12921. Page%       display page (normally zero)
  12922. Fast%       whether to use fast mode (0 no)
  12923.  
  12924. Name  : WriteBitF            (Write Bit Field)
  12925. Class : Numeric
  12926. Level : Any
  12927.  
  12928. This routine allows you to set an element of a virtual array.
  12929. The actual array can be any numeric type, as it is just being
  12930. used as a storage area. The virtual array is composed of numbers
  12931. of a bit length that you specify (1-8). This provides efficient
  12932. storage for numbers which have a limited range.
  12933.  
  12934. Here's how you DIM the actual array, assuming an integer array
  12935. is used:
  12936.    DIM Array%(1 TO (VirtElements * VirtBits + 15) \ 16)
  12937.  
  12938. "VirtElements" is the number of elements in the virtual array
  12939. and "VirtBits" is the number of bits per element.
  12940.  
  12941. See also ReadBitF.
  12942.  
  12943.    WriteBitF DSeg%, DOfs%, ElementNr&, BitLen%, Value%
  12944.  
  12945. DSeg%        segment of actual array
  12946. DOfs%        offset of actual array
  12947. ElementNr&   virtual element number (starts at 0)
  12948. BitLen%      bits per virtual element (1-8)
  12949. Value%       value to set element to (range depends on BitLen%)
  12950.  
  12951. Name  : Xlate                (Translate)
  12952. Class : String
  12953. Level : Any
  12954.  
  12955. The Xlate routine allows for translating a string, character by
  12956. character, very quickly. It uses a translation table that you
  12957. provide. This table is 256 bytes long, one byte for each
  12958. character in the ASCII table. The translation is done by
  12959. position-- for instance, if the original character was "A"
  12960. (ASCII 65), the translated character will be whatever is in the
  12961. translation table at position 66. Why 66, when "A" is 65?
  12962. Because ASCII runs from 0-255, but the translation string is
  12963. 1-256: everything is one higher in the string than the ASCII
  12964. character it represents.
  12965.  
  12966. Translation capabilities are handy in communications software.
  12967. They can also be used in other things. One simple use would be
  12968. to set up a translation table where all lowercase characters
  12969. would be converted to uppercase. You might ask why, since BASIC
  12970. has a UCASE$ function and PBClone has an Upcase routine. Well,
  12971. Upcase is faster than UCASE$, since it doesn't have to create a
  12972. return string; but Xlate would be even faster, since it
  12973. translates every character directly instead of deciding whether
  12974. it's a lowercase letter!
  12975.  
  12976. Simple encoding, WordStar file decryption, string reversal,
  12977. uppercase / lowercase conversion, and many other things can be
  12978. done with Xlate.
  12979.  
  12980. Remember to initialize all 256 characters in the translation
  12981. table!
  12982.  
  12983.    Xlate St$, XlateTable$
  12984.  
  12985. St$          string to translate
  12986. XlateTable$  translation table
  12987. -------
  12988. St$          translated string
  12989.  
  12990. Name  : XMPrint              (Translate and MS-DOS Print)
  12991. Class : Display
  12992. Level : DOS
  12993.  
  12994. A combination of the Xlate and DMPrint routines, this 'un allows
  12995. you to display using DOS services while being able to translate
  12996. or screen out characters. Each character of the string to
  12997. display is passed through a translation table you provide (256
  12998. bytes, where each position corresponds directly to the ASCII
  12999. code of the same number [0-255]). If the result is 0, the
  13000. character is not displayed. Otherwise, the translated character
  13001. is displayed using DOS display services. The new cursor position
  13002. is returned so you can inform BASIC about it.
  13003.  
  13004. Note that the new cursor position may not be accurate! Some ANSI
  13005. drivers do not update the BIOS cursor position info, in which
  13006. case the results won't be useful. That's a hazard of using DOS
  13007. output.
  13008.  
  13009.    XMPrint St$, XlateTable$, Row%, Column%
  13010.    LOCATE Row%, Column%
  13011.  
  13012. St$          string to display
  13013. XlateTable$  translation table
  13014. -------
  13015. Row%         current row
  13016. Column%      current column
  13017.  
  13018. Name  : XorSt                (XOR String)
  13019. Class : String
  13020. Level : Any
  13021.  
  13022. This routine XORs each byte in one string with the corresponding
  13023. byte in a second string. The strings must be the same length.
  13024.  
  13025.    XorSt St1$, St2$
  13026.  
  13027. St1$      string to XOR
  13028. St2$      string to XOR with
  13029. -------
  13030. St1$      result
  13031.  
  13032. Name  : XQPrint              (Extended Quick Print)
  13033. Class : Display
  13034. Level : Clone
  13035.  
  13036. This routine provides a rather crude, but very fast, display
  13037. capability. It works like the PRINT statement in BASIC, except
  13038. that it doesn't move the cursor or process control codes. It
  13039. works only in text modes.
  13040.  
  13041. See also QPrint, a slightly less flexible (but even faster)
  13042. routine.
  13043.  
  13044. The results of this routine are not redirectable by DOS.
  13045.  
  13046.    XQPrint St$, Row%, Column%, VAttr%, Page%, Fast%
  13047.  
  13048. St$       string to display
  13049. Row%      starting row
  13050. Column%   starting column
  13051. VAttr%    color/attribute (see CalcAttr)
  13052. Page%     display page (unused on MDA/Herc; normally 0)
  13053. Fast%     whether to use fast mode (0 no)
  13054.  
  13055. Name  : XQPrintOver          (Extended Quick Print Overwrite)
  13056. Class : Display
  13057. Level : Clone
  13058.  
  13059. This routine provides a rather crude, but very fast, display
  13060. capability. It works like the PRINT statement in BASIC, except
  13061. that it doesn't move the cursor or process control codes. It
  13062. works only in text modes.
  13063.  
  13064. This is a slightly unusual variant on a print routine. It
  13065. displays all characters except spaces. If your string contains a
  13066. space, that position on the screen will be skipped. In other
  13067. words, it acts kind of like an overlay. This can be handy when
  13068. you have text in alternating colors.
  13069.  
  13070. I came up with this routine when I designed a program with a
  13071. function key display at the bottom of the screen-- the names of
  13072. the function keys were one color and the associated definitions
  13073. were another color. It was obvious that the easiest way of
  13074. handling that would be to use an "overlay" approach. The
  13075. function key definitions were laid down with XQPrint. I then
  13076. overlaid the line with the function key names in a different
  13077. color, using XQPrintOver.
  13078.  
  13079. If you need a "solid" space, rather than a "transparent" space,
  13080. use CHR$(255) instead of CHR$(32).
  13081.  
  13082. The results of this routine are not redirectable by DOS.
  13083.  
  13084.    XQPrintOver St$, Row%, Column%, VAttr%, Page%, Fast%
  13085.  
  13086. St$       string to display
  13087. Row%      starting row
  13088. Column%   starting column
  13089. VAttr%    color/attribute (see CalcAttr)
  13090. Page%     display page (unused on MDA/Herc; normally 0)
  13091. Fast%     whether to use fast mode (0 no)
  13092.  
  13093.